多处理与独立方法一起使用,但不与类实例方法一起使用

时间:2015-09-01 14:50:56

标签: python multiprocessing

我使用多处理lib来测试python多进程,但我遇到了一些问题。我有测试代码1:

import multiprocessing

def test(name):
    print 'processing.....'
    tmp = 0
    for i in xrange(1000000000):
        tmp += i
    print 'process done'

if __name__ == '__main__':

    pools = multiprocessing.Pool()
    for i in xrange(2):
        pools.apply_async(test)
    pools.close()
    pools.join()

结果是:

processing
processing
done
done

代码2:

import multiprocessing

class Test:
    def test(name):
        print 'processing.....'
        tmp = 0
        for i in xrange(1000000000):
            tmp += i
        print 'process done'

if __name__ == '__main__':

    t = Test()
    pools = multiprocessing.Pool()
    for i in xrange(4):
        pools.apply_async(t.test)
    pools.close()
    pools.join()

这个结果什么都没有,这个池不调用t.test!我无法理解发生了什么。这是为什么?

1 个答案:

答案 0 :(得分:1)

而不是使用池,您只需在列表中收集作业:

import multiprocessing

class Test(multiprocessing.Process):
    def run(self):
        print 'processing.....'
        tmp = 0
        for i in xrange(10):
            tmp += i
        print 'process done'
        return 1

if __name__ == '__main__':
    jobs = []
    for i in range(5):
        t = Test()
        jobs.append(t)
        t.start()

列表作业将能够告诉您该过程是否已完成,最终会给您与使用池相同的效果。

如果你想确保完成所有工作:

if __name__ == '__main__':
    jobs = []
    for i in range(5):
        t = Test()
        jobs.append(t)
        t.start()
    not_done = any(job.is_alive() for job in jobs)
    while not_done:
        not_done = any(job.is_alive() for job in jobs)
    print 'job all done'