我浏览了文档https://docs.python.org/2/library/multiprocessing.html#managers和 我不太明白“结果准备就会阻止”是什么意思 这是否意味着其中任何一个:
对于pool.map(worker_num = 5)
,这5名工作人员将一个接一个地工作,结果会一直阻止直到准备好了吗?
对于pool_job_1 = pool.map(4);pool_job_2 = pool.map(4).
pool_job_2
只会在pool_job_1
完成后开始?
我现在赞成第二次解释。这对我正在做的事情很重要,因为我想按顺序运行它,一次只运行一个。我怎样才能做到这一点?我可以使用lock并将其作为参数传递给Process:
for item in my_list:
Process(func, (item,lock...))
在我的函数中,我添加lock.acquire()
和lock.release()
以确保它一次运行一个进程。这种方法的问题是:我将创建太多的进程(processes = length of my_list
)。
我正在考虑在地图功能中添加锁定或在池中设置processes = 1
。
更新
通过玩虚拟示例,人们应该清楚地了解地图功能正在做什么:
from multiprocessing import Process, Pool
import os
import time
def sleeper(args):
name = args[0]
seconds = args[1]
print ('starting child process with id:%d '% os.getpid())
print ('parent process:%d' % os.getppid())
print ('sleeping for %s ' % seconds)
time.sleep(seconds)
print ("Done sleeping")
# if __name__ == '__main__':
# print ("in parent process (id %d)" % os.getpid())
# for j in reversed(range(10,15)):
# p = Process(target=sleeper, args=('bob', j))
# p.start()
# print ("in parent process after child process start")
# print ("parent process about to join child process")
# p.join()
# print ("in parent process after child process join")
# print ("parent process exiting with id %d "% os.getpid())
# print ("The parent's parent process:%d" % os.getppid())
if __name__ == '__main__':
print ("in parent process (id %d)" % os.getpid())
pool = Pool(1)
pool.map(sleeper, [('bob',x) for x in reversed(range(10,15))], 1)
它在开始时启动任何进程,并将“iterable”划分为这些进程。但我之前错过的一件事是:它不会在中间创建新进程,而是始终使用它在一开始就创建的进程。