首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >join多进程池类在Python3 ()方法中卡住

join多进程池类在Python3 ()方法中卡住
EN

Stack Overflow用户
提问于 2020-12-19 07:01:03
回答 1查看 54关注 0票数 1

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

代码语言:javascript
复制
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))

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

代码语言:javascript
复制
---------------------------------------------------------------------------
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: 
EN

回答 1

Stack Overflow用户

发布于 2020-12-20 05:55:37

此问题仅出现在Jupyter笔记本电脑中。在终端中运行代码时,join()方法没有问题。不确定如何修复笔记本电脑。我已经尝试卸载anaconda并使用pip3重新安装notebook。但是没有成功

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65365010

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档