在使用Pool调用Python函数后,如何确保所有子进程都被终止?

时间:2015-08-05 19:08:37

标签: python python-3.x multiprocessing python-unittest

我的问题是在多处理模块中使用Pool时生成和终止子进程。

考虑两个模块,multiproc.pyunit_test_multiproc.py

模块multiproc.py

from multiprocessing import Pool


def say_hello(num, name1, name2):
    return ', '.join(['Hello', name1, name2, str(num)])


def say_hello_4procs():
    with Pool(4) as p:
        lst = p.starmap(say_hello, [(0, 'Jack', 'Jill'),
                                    (1, 'Batman', 'Robin'),
                                    (2, 'Janeway', 'Picard'),
                                    (3, 'Marco', 'Polo')])
        p.close()
        p.terminate()
        p.join()

    return lst


if __name__ == '__main__':
    print(__name__)
    lst = say_hello_4procs()
    print('\n'.join(lst))

模块unit_test_multiproc.py

import unittest
import multiproc

print('__name__')


class TestCases(unittest.TestCase):

    def test_1(self):
        lst = multiproc.say_hello_4procs()
        print('\n'.join(lst))


if __name__ == '__main__':
    unittest.main()

直接运行multiproc.py会得到预期的输出:

__main__
Hello, Jack, Jill, 0
Hello, Batman, Robin, 1
Hello, Janeway, Picard, 2
Hello, Marco, Polo, 3

但是,当我运行unit_test_multiproc.py时,我会遇到这种意外行为:

__main__
__parents_main__
__parents_main__
Hello, Jack, Jill, 0
Hello, Batman, Robin, 1
Hello, Janeway, Picard, 2
Hello, Marco, Polo, 3
.
-------------------------------------------
Run 1 test in 0.172s

OK

似乎有一些子流程被创建但未被杀死。我怎样才能解决这个问题?我已经知道从池中调用close()terminate()join()应该会杀死所有子进程。但显然我错过了一些东西。

我已经通过了调试器,并且我发现那些__parents_main__字符串是从multiproc.py内打印出来的,但它是实际的名称测试模块。

感谢您的帮助!

0 个答案:

没有答案