我的问题是在多处理模块中使用Pool时生成和终止子进程。
考虑两个模块,multiproc.py
和unit_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
内打印出来的,但它是实际的名称测试模块。
感谢您的帮助!