关于进程之间的通信报错:FileNotFoundError: [Errno 2] No such file or directory

万叶集
隐约雷鸣,阴霾天空。
但盼风雨来,能留你在此。

前言
✌ 作者简介:渴望力量的哈士奇,大家可以叫我 哈士奇 。(我真的有一只哈士奇)
如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步
人生格言:优于别人,并不高贵,真正的高贵应该是优于过去的自己。
如果感觉博主的文章还不错的话,还请关注、点赞、收藏三连支持一下博主哦


系列专栏:
               ⛽️ Python全栈系列 - [更新中]     【 本文在该系列】
                        Python零基础入门篇
                        Python语法进阶篇
               网安之路系列
​                       网安之路踩坑篇
​                       网安知识扫盲篇
​                       Vulhub 漏洞复现篇
​                       Shell脚本编程篇
​                       Web攻防篇   2021年9月3日停止更新,转战先知等安全社区
​                       渗透工具使用集锦  2021年9月3日停止更新,转战先知等安全社区
​                ⭐️ 点点点工程师系列
​                       测试神器 - Charles 篇
​                       测试神器 - Fiddler 篇
​                       测试神器 - Jmeter 篇
​                       自动化 - RobotFrameWork 系列
​                       自动化 - 基于 JAVA 实现的WEB端UI自动化
                       自动化 - 基于 MonkeyRunner 实现的APP端UI自动化

前言:这是我在尝试模拟写一个进程之间通信的场景,出现的报错。

示例脚本如下:

# coding:utf-8


import json
import multiprocessing


class Work(object):     # 定义一个 Work 类
    def __init__(self, queue):      # 构造函数传入一个 '队列对象' --> queue
            self.queue = queue

    def send(self, message):        # 定义一个 send(发送) 函数,传入 message
                                    # [这里有个隐藏的bug,就是只判断了传入的是否字符串类型;如果传入的是函数、类、集合等依然会报错]
        if not isinstance(message, str):    # 判断传入的 message 是否为字符串,若不是,则进行 json 序列化
            message = json.dumps(message)
        self.queue.put(message)     # 利用 queue 的队列实例化对象将 message 发送出去

    def receive(self):      # 定义一个 receive(接收) 函数,不需传入参数,但是因为接收是一个源源不断的过程,所以需要使用 while 循环
        while 1:
            result = self.queue.get()   # 获取 '队列对象' --> queue 传入的message
                                        # 由于我们接收的 message 可能不是一个字符串,所以要进程异常的捕获
            try:                        # 如果传入的 message 符合 JSON 格式将赋值给 res ;若不符合,则直接使用 result 赋值 res
                res = json.loads(result)
            except:
                res = result
            print('接收到的信息为:{}'.format(res))


if __name__ == '__main__':
    queue = multiprocessing.Queue()
    work = Work(queue)
    send = multiprocessing.Process(target=work.send, args=({'message': '这是一条测试的消息'},))
    receive = multiprocessing.Process(target=work.receive)

    send.start()
    receive.start()

报错截图示例如下:


这里的报错提示是 文件没有被发现的意思 。其实这里是我们使用 队列做 put() 和 get()的时候 有一把无形的锁加了上去,就是上图中圈中的 .SemLock 。我们不需要去关心造成这个错误的具体原因,要解决这个问题其实也很简单。

我们只需要给 send 或者 receive 其中一个子进程添加 join 阻塞进程即可,理论上如此。但是我们的 receive子进程是一个 while循环,它会一直执行,所以只需要给 send 子进程加上一个 join 即可。


解决示意图如下:


PS:虽然解决了报错问题,但是程序没有正常退出。

实际上由于我们的 receive 进程是个 while循环,并不知道要处理到什么时候,没有办法立刻终止。所以我们需要在 receive 进程 使用 terminate() 函数终结接收端。


运行结果如下:



你可能感兴趣的:(Python全栈系列[更新中],#,Python语法进阶篇,FileNotFoundEr,进程之间的通信异常)