multiprocessing - python3.8多进程锁
问题描述
这是我在 MacOS 上的 python3.8 代码,但它会抛出 FileNotFoundError。在python3.6或python3.7上都可以。很奇怪!!!
# coding: utf-8
import time
from multiprocessing import Process, Lock
def task(name, lock):
lock.acquire()
print('%s 1' % name)
time.sleep(1)
print('%s 2' % name)
lock.release()
if __name__ == '__main__':
mutex = Lock()
for i in range(3):
p = Process(target=task, args=('Process %s' % i, mutex))
p.start()
结果
......
"/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/multiprocessing/synchronize.py", line 110, in __setstate__
self._semlock = _multiprocessing.SemLock._rebuild(*state)
FileNotFoundError: [Errno 2] No such file or directory
解决方案
您需要在其中添加一个联接。请注意,不能保证进程将按照您的要求按数字顺序开始。您需要在流程开始之前添加延迟,以确保它以您期望的顺序添加到执行队列中。
# coding: utf-8
import time
from multiprocessing import Process, Lock
def task(name, lock):
lock.acquire()
print('%s 1' % name)
time.sleep(1)
print('%s 2' % name)
lock.release()
if __name__ == '__main__':
proceses = []
mutex = Lock()
for i in range(3):
p = Process(target=task, args=('Process %s' % i, mutex))
proceses.append(p)
p.start()
for p in proceses:
p.join()
推荐阅读
- kendo-ui - KendoUI 多选取消选择事件在 jquery 中未正确绑定
- javascript - 使用 React 检测 DOM 元素的任意位置
- java - 如何在 Contacts Android 应用程序中为已注册的用户联系人显示我的应用程序图标?
- mysql - MYSQL中的单表或多表
- api - 如何向 Xamarin Android 应用程序发送推送通知?
- java - 应该使用 JComboBox java netbeans 将类别 ID 添加到数据库中,而不是添加类别名称
- session - Yii2 从不注销空闲或离开用户
- javascript - 用 selenium 交换 javaScript
- c++ - 地图的 std::for_each() 给出无效的初始化错误
- dart - Observable.merge 仅使用 RxDart 显示来自一个流的结果