Python3多处理池类在join()方法中被卡住



正在尝试运行下面的代码。但是,我无法使用join((方法将结果组合到一个字典中。它只是无限期地继续下去。不确定我是做错了什么,还是有些库还没有针对我的MacBook硅进行优化。

import random
import time
import multiprocessing as mp
import math
start_time = time.time()
probs = {"cats":0.10,"dogs": 0.80, "bats": 0.10}
calculations = 10000
processors = 8
def f(how_many_times, times):
for i in range(how_many_times):
rand_num = random.random()
total = 0
for animal, prob in probs.items():
total += prob
if total > rand_num:
times[animal] += 1
break
if __name__ == '__main__':
start_time = time.time()

manager = mp.Manager()
total_times = manager.dict()
pool = mp.Pool(processors)
calculations_per_processor = math.floor(calculations/processors)
for i in range(processors):
job = pool.apply_async(f, args=(calculations_per_processor, total_times))

pool.close()
pool.join()

print("--- %s seconds ---" % (time.time() - start_time))

代码在强制退出后给出以下报告:

---------------------------------------------------------------------------
KeyboardInterrupt                         Traceback (most recent call last)
<ipython-input-3-890e4966932e> in <module>
10 
11     pool.close()
---> 12     pool.join()
13 
14     print("--- %s seconds ---" % (time.time() - start_time))
/opt/anaconda3/lib/python3.8/multiprocessing/pool.py in join(self)
660         elif self._state not in (CLOSE, TERMINATE):
661             raise ValueError("In unknown state")
--> 662         self._worker_handler.join()
663         self._task_handler.join()
664         self._result_handler.join()
/opt/anaconda3/lib/python3.8/threading.py in join(self, timeout)
1009 
1010         if timeout is None:
-> 1011             self._wait_for_tstate_lock()
1012         else:
1013             # the behavior of a negative timeout isn't documented, but
/opt/anaconda3/lib/python3.8/threading.py in _wait_for_tstate_lock(self, block, timeout)
1025         if lock is None:  # already determined that the C code is done
1026             assert self._is_stopped
-> 1027         elif lock.acquire(block, timeout):
1028             lock.release()
1029             self._stop()
KeyboardInterrupt: 

此问题仅发生在Jupyter笔记本中。在终端中运行代码时,我对join((方法没有任何问题。不知道如何修复笔记本。我已经试着卸载anaconda并用pip3重新安装笔记本电脑。没有成功

最新更新