满足条件时终止所有进程
Terminate all processes when condition is met
我正在使用 starmap 运行 测试功能。
当进程首次找到排列 [5,2,4,3,1] 时,终止所有进程的 best/safest 方法是什么?
import multiprocessing as mp
import time
def testing(lts):
# code ....
start_time = time.time()
for x in range(1,500000):
gg = [1,2,3,4,5]
random.shuffle(gg)
### if gg==[5,2,4,3,1] terminate all processes
total_time = time.time() - start_time
return total_time
if __name__ == '__main__':
with mp.Pool(processes=4) as pool:
ret = pool.starmap(testing, [(lst,) for x in range(4)])
我不是很熟悉所有这些 multiprocessing
东西,但是设置全局变量只适用于线程。 multiprocessing
创建不同的进程,因此全局变量将被复制,值的更改仅在 当前 进程中可见。
相反,使用 Manager
,它在进程之间创建一个共享对象(例如字典、列表)。
可能有更简单的方法,但我选择创建一个共享的 Manager.list()
对象,它最初是空的。
找到组合后,只需在列表中添加一些内容即可。在所有进程中测试列表是否为空。我已经调整了你的例子,所以它按原样工作(这里不需要 numpy
,random.shuffle
工作正常。
import multiprocessing as mp, random
import time
def testing(lst):
# code ....
start_time = time.time()
for x in range(1,500000):
gg = [1,2,3,4,5]
random.shuffle(gg)
if gg==[5,2,4,3,1]:
print(gg)
lst.append(1) # reflected on all processes
if lst:
# list is no longer empty: stop
print("stop")
break
total_time = time.time() - start_time
return total_time
if __name__ == '__main__':
manager = mp.Manager()
lst = manager.list()
with mp.Pool(processes=4) as pool:
ret = pool.starmap(testing, [(lst,) for x in range(4)])
print(ret)
执行痕迹:
[5, 2, 4, 3, 1]
stop
stop
stop
stop
[0.031249523162841797, 0.015624523162841797, 0.015624523162841797, 0.015624523162841797]
如我们所见,当其中一个发现 "solution".
时,4 个进程已停止
我正在使用 starmap 运行 测试功能。
当进程首次找到排列 [5,2,4,3,1] 时,终止所有进程的 best/safest 方法是什么?
import multiprocessing as mp
import time
def testing(lts):
# code ....
start_time = time.time()
for x in range(1,500000):
gg = [1,2,3,4,5]
random.shuffle(gg)
### if gg==[5,2,4,3,1] terminate all processes
total_time = time.time() - start_time
return total_time
if __name__ == '__main__':
with mp.Pool(processes=4) as pool:
ret = pool.starmap(testing, [(lst,) for x in range(4)])
我不是很熟悉所有这些 multiprocessing
东西,但是设置全局变量只适用于线程。 multiprocessing
创建不同的进程,因此全局变量将被复制,值的更改仅在 当前 进程中可见。
相反,使用 Manager
,它在进程之间创建一个共享对象(例如字典、列表)。
可能有更简单的方法,但我选择创建一个共享的 Manager.list()
对象,它最初是空的。
找到组合后,只需在列表中添加一些内容即可。在所有进程中测试列表是否为空。我已经调整了你的例子,所以它按原样工作(这里不需要 numpy
,random.shuffle
工作正常。
import multiprocessing as mp, random
import time
def testing(lst):
# code ....
start_time = time.time()
for x in range(1,500000):
gg = [1,2,3,4,5]
random.shuffle(gg)
if gg==[5,2,4,3,1]:
print(gg)
lst.append(1) # reflected on all processes
if lst:
# list is no longer empty: stop
print("stop")
break
total_time = time.time() - start_time
return total_time
if __name__ == '__main__':
manager = mp.Manager()
lst = manager.list()
with mp.Pool(processes=4) as pool:
ret = pool.starmap(testing, [(lst,) for x in range(4)])
print(ret)
执行痕迹:
[5, 2, 4, 3, 1]
stop
stop
stop
stop
[0.031249523162841797, 0.015624523162841797, 0.015624523162841797, 0.015624523162841797]
如我们所见,当其中一个发现 "solution".
时,4 个进程已停止