关于进程之间的通信报错: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-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()
报错截图示例如下:
这里的报错提示是 文件没有被发现的意思
。其实这里是我们使用 队列做 put() 和 get()的时候
有一把无形的锁加了上去,就是上图中圈中的 .SemLock
。我们不需要去关心造成这个错误的具体原因,要解决这个问题其实也很简单。
我们只需要给 send 或者 receive
其中一个子进程添加 join
阻塞进程即可,理论上如此。但是我们的 receive
子进程是一个 while循环
,它会一直执行,所以只需要给 send
子进程加上一个 join
即可。
解决示意图如下:
PS:虽然解决了报错问题,但是程序没有正常退出。
实际上由于我们的 receive
进程是个 while循环
,并不知道要处理到什么时候,没有办法立刻终止。所以我们需要在 receive 进程
使用 terminate()
函数终结接收端。
运行结果如下: