【问题标题】:Python Multiprocess not terminatePython多进程不终止
【发布时间】:2016-05-10 14:20:46
【问题描述】:

我是 python 多进程的新手,我想了解为什么我的代码不会终止(可能是僵尸或死锁)以及如何修复它。 createChain 函数也执行一个 for 循环并返回一个元组:(value1, value2)。在createChain 函数内部还有对其他函数的其他调用。我不认为发布createChain 函数代码会有所帮助,因为在该函数内部我没有做有关多进程的事情。我试图将进程设置为守护进程,但仍然无法正常工作。奇怪的想法是,如果我将 maxChains 的值减小到 500 或 100 就可以了。

我只是想让进程做一些繁重的任务并将结果放入一个数据类型。

我的python版本是2.7

def createTable(chainsPerCore, q, chainLength):

    for chain in xrange(chainsPerCore):
         q.put(createChain(chainLength, chain))


def initTable():
    maxChains = 1000
    chainLength = 10000
    resultsQueue = JoinableQueue()
    numOfCores = cpu_count()
    chainsPerCore = maxChains / numOfCores

    processes = [Process(target=createTable, args=(chainsPerCore, resultsQueue, chainLength,)) for x in range(numOfCores)]

    for p in processes:
        # p.daemon = True
        p.start()

    # Wait for hashing cores to finish
    for p in processes:
        p.join()

    resultsQueue.task_done()

    temp = [resultsQueue.get() for p in processes]
    print temp

【问题讨论】:

  • 有可能只需要很长时间吗?有什么方法可以让您在处理运行时获得某种信号?
  • 不需要那么长时间。如果我在没有多进程的情况下运行它,它将在 1 分钟内终止。此外,当我使用多进程时,我监控 CPU,我看到内核正在运行,几秒钟后它们停止,所以工作已经终止,但程序没有终止。谢谢!
  • 在这种情况下,我建议在每个步骤之间添加print 语句(p.start() 循环、p.join() 循环、resultsQueue.task_done() 然后temp = ..),然后查看哪个它冻结在。
  • 我添加了print 语句。它冻结在p.join() 上。这两个进程都没有通过p.join()。我应该发布其余的代码吗??
  • 也许可以,但为什么resultsQueue 是一个可加入 队列?不是说事情可以等它完成再继续,那肯定会造成死锁。

标签: python multiprocess rainbowtable


【解决方案1】:

基于 Tadhg McDonald-Jensen 非常有用的 cmets,我更好地了解了我的需求以及队列的工作原理以及它们应该用于什么目的。

我将代码更改为

def initTable(output):
    maxChains = 1000

    results = []

    with closing(Pool(processes=8)) as pool:
        results = pool.map(createChain, xrange(maxChains))
        pool.terminate()

【讨论】:

    猜你喜欢
    • 2013-09-09
    • 1970-01-01
    • 1970-01-01
    • 2014-10-25
    • 2018-10-11
    • 2016-11-22
    • 1970-01-01
    • 1970-01-01
    • 2021-07-17
    相关资源
    最近更新 更多