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

关于进程之间的通信报错: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自动化

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

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

示例脚本如下:

# coding:utf-8import jsonimport multiprocessingclass 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()

报错截图示例如下:


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

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

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


解决示意图如下:


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

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

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


运行结果如下:


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