如何解决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 重新安装笔记本。虽然没有成功
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。