多输出从蟒多重函数返回(multiple output returned from python m

2019-10-17 15:50发布

我试图用多返回一个列表,而不是等待,直到所有工序均由内部完成,我得到一些回报,从一个return语句在mp_factorizer,就像这样:

None
None
(returns list)

在这个例子中我使用2个线程。 如果我用了5个线程,就不会有列表中被放出来之前5无返回。 下面是代码:

def mp_factorizer(nums, nprocs, objecttouse):
    if __name__ == '__main__':
        out_q = multiprocessing.Queue()
        chunksize = int(math.ceil(len(nums) / float(nprocs)))
        procs = []
        for i in range(nprocs):
            p = multiprocessing.Process(
                    target=worker,                   
                    args=(nums[chunksize * i:chunksize * (i + 1)],
                          out_q,
                    objecttouse))
            procs.append(p)
            p.start()

        # Collect all results into a single result dict. We know how many dicts
        # with results to expect.
        resultlist = []
        for i in range(nprocs):
            temp=out_q.get()
            index =0
            for i in temp:
                resultlist.append(temp[index][0][0:])
                index +=1

        # Wait for all worker processes to finish
        for p in procs:
            p.join()
            resultlist2 = [x for x in resultlist if x != []]
        return resultlist2

def worker(nums, out_q, objecttouse):
    """ The worker function, invoked in a process. 'nums' is a
        list of numbers to factor. The results are placed in
        a dictionary that's pushed to a queue.
    """
    outlist = []
    for n in nums:        
        outputlist=objecttouse.getevents(n)
        if outputlist:
            outlist.append(outputlist)   
    out_q.put(outlist)

mp_factorizer得到的物品,线程#列表,并且该工作人员应该使用一个对象,它然后分裂了项目列表,以便所有线程获取列表等量,并启动工人。 工人然后使用该对象从给定的列表计算的东西,其结果添加到队列中。 Mp_factorizer应该收集从队列中的所有结果,它们合并成一个大名单,并返回该列表。 然而 - 我得到多方面的回报。

我究竟做错了什么? 或者这是预期的行为,由于奇怪的方式Windows处理多重? (Python的2.7.3,Windows7的64位)

编辑:问题是错误的位置if __name__ == '__main__': 我发现了另一个问题工作时,看到在一个子过程中使用多一个完整的解释。

Answer 1:

if __name__ == '__main__'是放错了地方。 速战速决将是保护只调用mp_factorizer像詹恩Karila建议:

if __name__ == '__main__':
    print mp_factorizer(list, 2, someobject)

然而,在Windows主文件将在一次执行+一次,每个工人的线程中执行,在这种情况下2.因此,这将是一个总的主线程中执行3,不包括代码的受保护的部分。

这可只要有在同一个主线程正在取得其他计算会出现问题,并且至少是不必要的减速性能。 尽管只有工人功能应该在窗户都被执行多次,将被执行那不是受保护的if __name__ == '__main__'

因此,解决办法是通过执行所有代码后,才以保护整个主进程if __name__ == '__main__'

如果工人的功能是在同一个文件 ,但是,它需要从这个if语句排除,因为否则就不能称为几次多。

伪主线:

# Import stuff
if __name__ == '__main__':
    #execute whatever you want, it will only be executed 
    #as often as you intend it to
    #execute the function that starts multiprocessing, 
    #in this case mp_factorizer()
    #there is no worker function code here, it's in another file.

虽然整个过程主要是受保护的,工人功能仍然可以启动,只要它是在另一个文件。

伪主线程,与工人功能:

# Import stuff
#If the worker code is in the main thread, exclude it from the if statement:
def worker():
    #worker code
if __name__ == '__main__':
    #execute whatever you want, it will only be executed 
    #as often as you intend it to
    #execute the function that starts multiprocessing, 
    #in this case mp_factorizer()
#All code outside of the if statement will be executed multiple times
#depending on the # of assigned worker threads.

对于运行的代码更详细的解释,看到在一个子过程中使用多



Answer 2:

if __name__ == '__main__'语句是放错了地方。 把它周围的print语句来防止从子流程执行该行:

if __name__ == '__main__':
    print mp_factorizer(list, 2, someobject)

现在你有if内部mp_factorizer ,这使得该函数返回None子进程中调用时。



文章来源: multiple output returned from python multiprocessing function