Как запустить оформленную функцию в отдельном и прерывистом процессе? - PullRequest
0 голосов
/ 07 ноября 2019

Я имею дело с существующим набором тестов, в котором мы хотим реализовать функцию тайм-аута, которая приведет к истечению времени ожидания зависшего теста, а затем к его регулярному демонтажу / очистке.

Я играюс идеей запуска каждого теста в процессе, который я могу прекратить, например, по истечении времени ожидания 3 секунды. В идеале я не хочу изменять тестовые случаи и вместо этого просто добавить декоратор, указывающий, что этот тайм-аут влияет на тест.

Это то, что у меня есть, минимальный пример:

import multiprocessing
import sys
from time import sleep


def timeout(func):
    def wrapper():
        proc = multiprocessing.Process(target=func)
        proc.start()
        sleep(3)
        proc.terminate()
    return wrapper


@timeout
def my_test():
    while True:
        sleep(1)


if __name__ == "__main__":
    my_test()

Но по какой-то причине, кажется, что pickle не может справиться с этим, и декоратор каким-то образом путает ссылку на функцию, так как эта ошибка вызвана:

$ python multiproc.py
2019-11-07 07:34:37.098 | DEBUG    | __main__:wrapper:13 - In wrapper
Traceback (most recent call last):
  File "multiproc.py", line 30, in <module>
    my_test()
  File "multiproc.py", line 15, in wrapper
    proc.start()
  File "C:\Python36\lib\multiprocessing\process.py", line 105, in start
    self._popen = self._Popen(self)
  File "C:\Python36\lib\multiprocessing\context.py", line 223, in _Popen
    return _default_context.get_context().Process._Popen(process_obj)
  File "C:\Python36\lib\multiprocessing\context.py", line 322, in _Popen
    return Popen(process_obj)
  File "C:\Python36\lib\multiprocessing\popen_spawn_win32.py", line 65, in __init__
    reduction.dump(process_obj, to_child)
  File "C:\Python36\lib\multiprocessing\reduction.py", line 60, in dump
    ForkingPickler(file, protocol).dump(obj)
_pickle.PicklingError: Can't pickle <function my_test at 0x000001C0A7E87400>: it's not the same object as __main__.my_test
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "C:\Python36\lib\multiprocessing\spawn.py", line 99, in spawn_main
    new_handle = reduction.steal_handle(parent_pid, pipe_handle)
  File "C:\Python36\lib\multiprocessing\reduction.py", line 82, in steal_handle
    _winapi.PROCESS_DUP_HANDLE, False, source_pid)
OSError: [WinError 87] The parameter is incorrect

У кого-нибудь есть идея, если это можетрешить без изменения существующего контрольного примера?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...