Phyton 文档和 Internet 上的多进程使用锁的示例在我复制时不提供竞争保护 - 示例的输出不是按恒定顺序,但在每次运行时输出顺序是随机的。确保列表保持恒定顺序的唯一方法是在末尾添加 p.join() ,但随后锁就失去了意义。是什么原因?浪费了很多时间,我不明白。示例 1 取自http://python-3.ru/page/multiprocessing。
from multiprocessing import Process, Lock
def printer(item, lock):
"""
Выводим то что передали
"""
lock.acquire()
try:
print(item)
finally:
lock.release()
if __name__ == '__main__':
lock = Lock()
items = ['tango', 'foxtrot', 10]
for item in items:
p = Process(target=printer, args=(item, lock))
p.start()
文档中的示例代码 ( https://python.readthedocs.io/en/stable/library/multiprocessing.html#exchanging-objects-between-processes ) - 17.2.1.4。进程之间的同步
from multiprocessing import Process, Lock
def f(l, i):
l.acquire()
try:
print('hello world', i)
finally:
l.release()
if __name__ == '__main__':
lock = Lock()
for num in range(10):
Process(target=f, args=(lock, num)).start()
需要锁不是为了确保锁之间的顺序,而是为了确保在锁定的块内没有同时执行。
将一些输出命令添加到被阻止的块。此外,添加更多或添加延迟。使引脚之间的时间超过启动开销。应该混合来自不同流的行。如果它们甚至与锁混合在一起,那么你做错了什么。