Как лучше всего дублировать fork() в Windows?

Как мне реализовать некоторую логику, которая позволит мне воспроизвести в Windows функции, которые у меня есть в Linux, с системным вызовом fork(), используя Python?

Я специально пытаюсь выполнить метод в компоненте SAPI Com, продолжая другую логику в основном потоке без блокировки или ожидания.


person RyanBrady    schedule 22.08.2008    source источник


Ответы (7)


Используйте многопроцессорный модуль Python, который будет работать везде.

Вот статья IBM developerWords, в которой показано, как преобразовать os. fork() в многопроцессорный модуль.

person kanaka    schedule 16.05.2011
comment
Это правильный ответ, но из-за отсутствия fork() в Windows есть несколько предостережений, главное из которых заключается в том, чтобы убедиться, что любой сценарий защищен защитой if __name__ == "__main__", если он должен вызывать любой код, который выполняет многопроцессорность. Порожденный процесс запускается заново, и ему необходимо загрузить модули, чтобы иметь возможность восстановить состояние. - person clacke; 13.09.2016
comment
Являются ли аргументы, переданные в multiprocessing.Process(), сериализуется, чтобы перейти к новому процессу? Я написал клиент-серверное приложение SSL. Сервер разветвляет новый процесс для каждого полученного запроса, но поднимает TypeError: cannot serialize socket object. То же самое с простым (не SSL) сокетом работало, как объяснено здесь. Но я не уверен, так как ошибка возникла по адресу socket.py, line 185, in __getstate__. - person Mahesha999; 19.06.2018

fork() фактически был продублирован в Windows под Cygwin, но это довольно волосато.

Вызов форка в Cygwin особенно интересен, потому что он плохо сочетается с Win32 API. Это очень затрудняет правильную реализацию.

См. Руководство пользователя Cygwin для получения описания этот хак.

person Hugh Allen    schedule 04.10.2008

Взгляните на функции управления процессами в модуле ОС. Существуют функции для запуска новых процессов разными способами, как синхронно, так и асинхронно.

Я также должен отметить, что Windows не предоставляет функциональность, аналогичную функции fork() в других системах. Для многопроцессорной обработки в Windows вам потребуется модуль threading. .

person Greg Hewgill    schedule 22.08.2008
comment
subprocess и multiprocessing (предложенные RJBrady) могут быть лучшими альтернативами os и threading. - person jfs; 04.10.2008

Пример Threading от Эли запускает поток, но не выполняет никакой работы после этой строки.

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

person RyanBrady    schedule 09.09.2008
comment
Модуль multiprocessing является частью стандартной библиотеки. subprocess подходит для внешних программ, multiprocessing подходит для кода Python. - person jfs; 04.10.2008

В дополнение к коду управления процессами в модуле os, на который указал Грег, вам также следует взглянуть на модуль потоков: https://docs.python.org/library/threading.html

    from threading import Thread
    
    def separate_computations(x, y):
        print sum(x for i in range(y))  # really expensive multiplication
    
    Thread(target=separate_computations, args=[57, 83]).start()

    print "I'm continuing while that other function runs in another thread!"
person Eli Courtwright    schedule 22.08.2008


Возможно, версия spawn() для python? http://en.wikipedia.org/wiki/Spawn_(операционная_система)

person ftdysa    schedule 22.08.2008
comment
Это то, что multiprocessing делает в Windows в наши дни. docs.python.org/3.5/ библиотека/ - person clacke; 13.09.2016