调试示例没有产生我期望的结果。可能不完全理解等待和通知逻辑。以下是来自 PuCharm 的预期和收到的结果,其中包含许多评论 + 代码。请解释什么是错的。对理解的有用建议也非常感谢。
脚本的预期内容:
读取器进程无休止地打印该组合(“我们要打印这个”+ 10 次“并打印这个”),无休止地向写入器进程发送锁的释放。Writer 定期打印组合(“条件”+“然后我们等待”)。
会发生什么(描述):
writer1 进程挂在 cond.wait() 行上,可能没有收到来自 reader 进程的 cond.notify。为什么阅读器进程不循环发送 cond.notify 10 次尚不清楚。应该是卡在第一个了。
PуCharm 给出了一些关于 cond.notify 的警告,但我无法在谷歌上搜索它们的含义,例如 synchronize.py 中的 Python 方法的逻辑尚不清楚。在这种情况下,lock is notowned 的含义也不清楚。
会发生什么(屏幕):
Process Process-1:
Traceback (most recent call last):
File "C:\Users\Serge\AppData\Local\Programs\Python\Python310\lib\multiprocessing\process.py", line 315, in _bootstrap
self.run()
File "C:\Users\Serge\AppData\Local\Programs\Python\Python310\lib\multiprocessing\process.py", line 108, in run
self._target(*self._args, **self._kwargs)
File "C:\Users\Serge\PycharmProjects\pythonProject\main.py", line 10, in reader
cond.notify () #что-то не так
File "C:\Users\Serge\AppData\Local\Programs\Python\Python310\lib\multiprocessing\synchronize.py", line 271, in notify
assert self._lock._semlock._is_mine(), 'lock is not owned'
AssertionError: lock is not owned
хотим это печатать
и печатаем это
зашли сюда
condition
编码:
from multiprocessing import Process, Condition
import time
def reader(cond):
while True:
print('хотим это печатать')
for x in range (10):
print('и печатаем это')
cond.notify () #что-то не так
print('но не печатаем даже это')
time.sleep(1)
def writer1(cond):
print('зашли сюда')
with cond:
print('condition')
cond.wait() #зависаем здесь?
print('и тут дождались') #не печатается эта строка
if __name__ == '__main__':
condition = Condition()
new_process = Process(target=reader, args=(condition,))
new_process.start()
time.sleep(3)
new_process1 = Process(target=writer1, args=(condition,))
new_process1.start()
为了同时等待和发送通知
Condition,您必须首先获取与其关联的锁Condition。等待时,您可以这样做:
您需要对通知执行相同的操作:
仍然错过了最后的等待:
没有这个,主线程就会退出,尽管运行的进程仍然存在,但创建的进程
Condition可能无法完全运行,因为。它已经超出了范围。这在第二个过程中尤其明显,因为第二个过程延迟开始。multiprocess.Condition使用一个文件来存储一些信息,当主脚本结束时,该文件明显被删除,第二个进程无法获取其参数。