многопроцессорная PicklingError в Python 3.6.5, которая не встречается в 3.6.1 - PullRequest
0 голосов
/ 28 апреля 2018

Следующий код работает в Python 3.6.1 ... но возвращает эту ошибку в Python 3.6.5:

Traceback (most recent call last):
  File "G:/GOOD/Coding/Deepthroat/Deepthroat2/Bin/Testing/gh.py", line 36, in <module>
    loops.start()
  File "C:\Program Files\Python36\lib\multiprocessing\process.py", line 105, in start
    self._popen = self._Popen(self)
  File "C:\Program Files\Python36\lib\multiprocessing\context.py", line 223, in _Popen
    return _default_context.get_context().Process._Popen(process_obj)
  File "C:\Program Files\Python36\lib\multiprocessing\context.py", line 322, in _Popen
    return Popen(process_obj)
  File "C:\Program Files\Python36\lib\multiprocessing\popen_spawn_win32.py", line 65, in __init__
    reduction.dump(process_obj, to_child)
  File "C:\Program Files\Python36\lib\multiprocessing\reduction.py", line 60, in dump
    ForkingPickler(file, protocol).dump(obj)
_pickle.PicklingError: Can't pickle <function loops at 0x0000019D3E30B598>: it's not the same object as __main__.loops

Вот код:

from multiprocessing import Process
import time

def timeout(mm):
    for i in range(6):
        time.sleep(0.1)
    print('stop all bla loops now')

    mm.terminate()
    return


def loops():
    for i in range(5):
        time.sleep(0.1)
        print('loop1')

    billy = 'loop1 done'

    for i in range(5):
        time.sleep(0.1)
        print('loop2')

    billy = 'loop2 done'

    for i in range(5):
        time.sleep(0.1)
        print('loop3')

    billy = 'loop3 done'


billy = 'cool'

loops = Process(target=loops)
loops.start()

timeout = Process(target=timeout(loops))
timeout.start()

1 Ответ

0 голосов
/ 28 апреля 2018

Это на самом деле просто ошибка, потому что вы перезаписываете loops, что означает, что его нельзя засолить (команда pickle просто хранит ссылку на функцию). Если вы говорите, что эта ошибка не произошла в python3.6.1, то, вероятно, в python3.6.1

отсутствует тест
...