Отправка сокета через многопроцессорную очередь Python 3.6 - PullRequest
0 голосов
/ 01 декабря 2018

Я пытаюсь реализовать универсальную функцию «тайм-аут», которая позволяет мне отправлять функцию для запуска, и если она не завершается через определенное время, убить ее.Вот текущая реализация:

from multiprocessing import Process, Queue
import multiprocessing as mp
mp.allow_connection_pickling()
from fn.monad import Full, Empty
import traceback


def timeout(timeout, func, args=()):
    '''
    Calls function, and if it times out returns an Empty()
    :param timeout: int | The amount of time to wait for the function
    :param func: () => Any | The function to call (must take no arguments)
    :param queue: Queue | The multiprocessing queue to put the result into
    :return Option | Full(Result) if we get the result, Empty() if it times out
    '''


    queue = Queue()
    p = Process(target=_helper_func, args=(func, queue, args,))
    p.daemon = True
    p.start()
    p.join(timeout)
    if p.is_alive() or queue.empty():
        p.terminate()
        return Empty()
    else:
        out = queue.get()
        # if 'rebuild_handle' in dir(out):
        #   out.rebuild_handle()
        return Full(out)

def _helper_func(func, queue, args):
    try:
        func(*args, queue)
    except Exception as e:
        pass

Функция должна поместить «возвращаемое значение» в очередь многопроцессорной обработки.Однако, когда тайм-аут запущен и сокет помещен в очередь, я получаю следующую ошибку:

Traceback (most recent call last):
  File "socket_test.py", line 27, in <module>
    print(q.get())
  File "/usr/lib/python3.6/multiprocessing/queues.py", line 113, in get
    return _ForkingPickler.loads(res)
  File "/usr/lib/python3.6/multiprocessing/reduction.py", line 239, in _rebuild_socket
    fd = df.detach()
  File "/usr/lib/python3.6/multiprocessing/resource_sharer.py", line 57, in detach
    with _resource_sharer.get_connection(self._id) as conn:
  File "/usr/lib/python3.6/multiprocessing/resource_sharer.py", line 87, in get_connection
    c = Client(address, authkey=process.current_process().authkey)
  File "/usr/lib/python3.6/multiprocessing/connection.py", line 487, in Client
    c = SocketClient(address)
  File "/usr/lib/python3.6/multiprocessing/connection.py", line 614, in SocketClient
    s.connect(address)
ConnectionRefusedError: [Errno 111] Connection refused

Я пробовал различные предыдущие сообщения о переполнении стека, такие как: Python3 Windowsмногопроцессорная передача сокета в процесс

Пожалуйста, дайте мне знать, если вы знаете решение этой проблемы, так как оно бросает гигантский ключ в мой код.Спасибо!

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