다중 처리를 사용하는 unittest가 있습니다.python 3.4 unittest에서 다중 처리가 작동하지 않습니다.
파이썬 3.2에서 파이썬 3.4로 업그레이드 한 후 다음과 같은 오류가 발생합니다. 파이썬 내부에서 변경된 사항과 코드를 실행하기 위해 바꿔야 할 힌트를 찾을 수 없습니다.
미리 감사드립니다. 샘플 코드에 따라
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "C:\Python341_64\lib\multiprocessing\spawn.py", line 106, in spawn_main
exitcode = _main(fd)
File "C:\Python341_64\lib\multiprocessing\spawn.py", line 116, in _main
self = pickle.load(from_parent)
EOFError: Ran out of input
Error
Traceback (most recent call last):
File "D:\test_multiproc.py", line 46, in testSmallWorkflow
p.start()
File "C:\Python341_64\lib\multiprocessing\process.py", line 105, in start
self._popen = self._Popen(self)
File "C:\Python341_64\lib\multiprocessing\context.py", line 212, in _Popen
return _default_context.get_context().Process._Popen(process_obj)
File "C:\Python341_64\lib\multiprocessing\context.py", line 313, in _Popen
return Popen(process_obj)
File "C:\Python341_64\lib\multiprocessing\popen_spawn_win32.py", line 66, in __init__
reduction.dump(process_obj, to_child)
File "C:\Python341_64\lib\multiprocessing\reduction.py", line 59, in dump
ForkingPickler(file, protocol).dump(obj)
TypeError: cannot serialize '_io.TextIOWrapper' object
, 나는 오류를 재현 할 수있는 방법 :
import shutil
import traceback
import unittest
import time
from multiprocessing import Process
import os
class MyTest(unittest.TestCase):
#---------------------------------------------------------------------------
def setUp(self):
self.working_dir = os.path.join(os.environ["TEMP"], "Testing")
os.mkdir(self.working_dir)
#---------------------------------------------------------------------------
#---------------------------------------------------------------------------
def tearDown(self):
try:
time.sleep(5)
shutil.rmtree(self.working_dir, ignore_errors=True)
except OSError as err:
traceback.print_tb(err)
#---------------------------------------------------------------------------
#---------------------------------------------------------------------------
def info(self, title):
print(title)
print('module name:', __name__)
if hasattr(os, 'getppid'): # only available on Unix
print('parent process:', os.getppid())
print('process id:', os.getpid())
#---------------------------------------------------------------------------
#---------------------------------------------------------------------------
def f(self, name):
self.info('function f')
print('hello', name)
#---------------------------------------------------------------------------
#---------------------------------------------------------------------------
def testSmallWorkflow(self):
self.info('main line')
p = Process(target=self.f, args=('bob',))
p.start()
p.join()
#---------------------------------------------------------------------------
매우 유용하고 빠른 대답에 감사드립니다. 당신이 말했습니다, 그 unittest.Testcase _no longer_ pickable입니다. 이 문제에 대해 나에게 왜 더 많은 정보가 있습니까? 어쩌면 내가 읽을 수있는 링크일까요? – knumskull
@knumskull 어디서나 문서화되었는지는 알 수 없습니다. 나는 코드를보고 그것을 알아 냈다. 문제는'TestCase'가 내부적으로 사용하는'_Outcome' 객체가'unittest.runner.TextTestResult' 인스턴스 인'result' 속성을 포함하고 있다는 것입니다. 이 클래스는 각 테스트의 결과를 화면에 작성하는 일을 담당합니다. 그것은 pickle 될 수없는'_io.TextIoWrapper' 객체에 대한 참조를 포함합니다. 이번 주에 약간의 시간이 있으면 3.2에서 3.4 사이의 내용이 정확히 무엇인지 살펴보고 TestCase를 다시 pickleable하게 만들 수있는 패치를 제공 할 것입니다. – dano
설명해 주셔서 감사합니다. 그것은 나를 많이 도왔다. – knumskull