正在尝试运行下面的代码。但是,我无法使用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重新安装笔记本电脑。没有成功