万叶集 |
---|
隐约雷鸣,阴霾天空。 |
但盼风雨来,能留你在此。 |
前言:
✌ 作者简介:渴望力量的哈士奇,大家可以叫我 哈士奇 。(我真的有一只哈士奇)
如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步
人生格言:优于别人,并不高贵,真正的高贵应该是优于过去的自己。
如果感觉博主的文章还不错的话,还请关注、点赞、收藏三连支持一下博主哦
系列专栏:
⛽️ 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()
函数终结接收端。
运行结果如下: