学习Python3 互斥锁遇到的mac系统遇到的错误 FileNotFoundError: [Errno 2] No such file or directory
mac系统
python3.4更新后,默认用“spawn”,开启进程,我们要主动指定为“fork”
spawn:使用此方式启动的进程,只会执行和 target 参数或者 run() 方法相关的代码。Windows 平台只能使用此方法,事实上该平台默认使用的也是该启动方式。相比其他两种方式,此方式启动进程的效率最低。
fork:使用此方式启动的进程,基本等同于主进程(即主进程拥有的资源,该子进程全都有)。因此,该子进程会从创建位置起,和主进程一样执行程序中的代码。注意,此启动方式仅适用于 UNIX 平台,os.fork() 创建的进程就是采用此方式启动的。
forserver:使用此方式,程序将会启动一个服务器进程。即当程序每次请求启动新进程时,父进程都会连接到该服务器进程,请求由服务器进程来创建新进程。通过这种方式启动的进程不需要从父进程继承资源。注意,此启动方式只在 UNIX 平台上有效。
from multiprocessing import Process, Lock
import time
import multiprocessing
def task(name, mutex):
with mutex:
print("%s 1" % name)
time.sleep(1)
print("%s 2" % name)
time.sleep(1)
print("%s 3" % name)
if __name__ == '__main__':
# 第一种解决办法
multiprocessing.set_start_method("fork")
mutex = Lock()
for i in range(3):
p = Process(target=task, args=("子进程%s" % i, mutex))
p.start()
from multiprocessing import Process, Lock
import time
def task(name, mutex):
with mutex:
print("%s 1" % name)
time.sleep(1)
print("%s 2" % name)
time.sleep(1)
print("%s 3" % name)
if __name__ == '__main__':
"""
第二种解决办法
您需要在其中添加联接。注意,不能保证过程将按您的要求按数字顺序启动。
您需要在流程开始之前添加一个延迟,以确保按您期望的顺序将其添加到执行队列中。
"""
processes = []
mutex = Lock()
for i in range(3):
p = Process(target=task, args=('Process %s' % i, mutex))
processes.append(p)
p.start()
for p in processes:
p.join()