Мультипроцессинг -> pathos.multiprocessing и Windows

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

В настоящее время у меня есть решение, которое работает для моих нужд в Linux. У меня есть словарь функций и аргументов, который выглядит следующим образом:

 job_dict['func1'] = {'target': func1, 'args': (args,)}

Для каждого я создаю процесс:

 import multiprocessing
 for k in job_dict.keys():
     jobs[k] = multiprocessing.Process(target=job_dict[k]['target'],
                                       args=job_dict[k]['args'])

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

Это не работает в Windows. Многие из функций, которые я использую, являются обертками, использующими различные functools функции, и я получаю сообщения о неспособности сериализовать функции (см. Что может делать мультипроцессор и укроп вместе?). Я не понял, почему я не получаю эту ошибку в Linux, а в Windows.

Если я импортирую dill до запуска моих процессов в Windows я не получаю ошибку сериализации. Однако процессы на самом деле ничего не делают. Я не могу понять, почему.

Затем я переключился на многопроцессорную реализацию в pathos, но не нашел аналога простого Process класс в рамках стандарта multiprocessing модуль. Я смог создать темы для каждой работы, используя pathos.pools.ThreadPool, Я уверен, что это не предназначение для карты, но он запустил все потоки, и они запускались в Windows:

import pathos
tp = pathos.pools.ThreadPool()
for k in job_dict.keys():
    tp.uimap(job_dict[k]['target'], job_dict[k]['args'])

Однако теперь я не уверен, как отслеживать, является ли поток все еще активным, который я ищу, чтобы я мог перезапустить потоки, которые по тем или иным причинам перестали работать. Какие-либо предложения?

1 ответ

Решение

Я pathos а также dill автор. Process класс похоронен глубоко внутри pathos в pathos.helpers.mp.process.Process, где mp сама фактическая вилка multiprocessing библиотека. Все в multiprocessing должно быть доступно оттуда.

Еще одна вещь, чтобы знать о pathos является то, что он держит pool живой для вас, пока вы не удалите его из удержанного состояния. Это помогает снизить накладные расходы при создании "новых" пулов. Чтобы удалить пул, вы делаете:

>>> # create
>>> p = pathos.pools.ProcessPool()
>>> # remove
>>> p.clear()

Там нет такого механизма для Process тем не мение.

За multiprocessingWindows отличается от Linux и Macintosh... потому что Windows не имеет надлежащего fork как и в Linux... Linux может совместно использовать объекты между процессами, в то время как в Windows нет общего доступа... это в основном полностью независимый новый процесс, созданный... и, следовательно, сериализация должна быть лучше, чтобы объект передавался другому процессу - так же, как если бы вы отправили объект на другой компьютер. На Linux, вы должны сделать это, чтобы получить такое же поведение:

def check(obj, *args, **kwds):
    """check pickling of an object across another process"""
    import subprocess
    fail = True
    try:
        _x = dill.dumps(x, *args, **kwds)
        fail = False
    finally:
        if fail:
            print "DUMP FAILED"
    msg = "python -c import dill; print dill.loads(%s)" % repr(_x)
    print "SUCCESS" if not subprocess.call(msg.split(None,2)) else "LOAD FAILED"
Другие вопросы по тегам