Запускайте процессы параллельно с python на windows asyncio - PullRequest
0 голосов
/ 09 октября 2019

У меня есть код, который работает только в Linux с asyncio, но мне нужно, чтобы он работал в Windows, мои знания немногочисленны в области многопроцессорности, какой способ работы в Windows? Я видел, что есть ограничение asyncio для запуска на windows: https://docs.python.org/3/library/asyncio-platforms.html#asyncio-windows-subprocess

Мой код:

import sys
import asyncio


scriptspy = [
    'scrp1.py',
    'scrp2.py',
    'scrp3.py',
    'scrp4.py',
    'scrp5.py',
    'scrp6.py',
    'scrp7.py',
    'scrp8.py',
    'scrp9.py',
    'scrp10.py',
    'scrp11.py',
    'scrp12.py',
]

async def main():
    tarefas_rodando = set()
    while scriptspy:
        # start up to 6 scripts
        while len(tarefas_rodando) < 6 and scriptspy:
            script = scriptspy.pop()
            p = await asyncio.create_subprocess_exec(sys.executable, script)
            tarefa = asyncio.create_task(p.wait())
            tarefas_rodando.add(tarefa)
        # wait for one of the scripts to end
        tarefas_rodando, finalizadas = await asyncio.wait(tarefas_rodando, return_when=asyncio.FIRST_COMPLETED)
    # finished, wait for the rest to finish
    await asyncio.wait(tarefas_rodando, return_when=asyncio.ALL_COMPLETED)


asyncio.run(main())

Этот код отлично работает на Linux, но не на Windows. Мне нужно запустить его на окнах. https://docs.python.org/3/library/asyncio-platforms.html#asyncio-windows-subprocess

Исключительная ситуация в Windows:

Traceback (most recent call last):
   File "scripts.py", line 53, in <module>
    asyncio.run(main())
   File "C:\Python\Python37\lib\asyncio\runners.py", line 43, in run
    return loop.run_until_complete(main)
   File "C:\Python\Python37\lib\asyncio\base_events.py", line 584, in run_until_complete
    return future.result()
   File "scripts.py", line 44, in main
    p = await asyncio.create_subprocess_exec(sys.executable, script)
   File "C:\Python\Python37\lib\asyncio\subprocess.py", line 217, in create_subprocess_exec
    stderr=stderr, **kwds)
   File "C:\Python\Python37\lib\asyncio\base_events.py", line 1533, in subprocess_exec
    bufsize, **kwargs)
   File "C:\Python\Python37\lib\asyncio\base_events.py", line 463, in
_make_subprocess_transport
    raise NotImplementedError NotImplementedError

1 Ответ

0 голосов
/ 09 октября 2019

Согласно документации , для запуска подпроцессов в Windows необходимо переключиться в цикл обработки событий proactor:

asyncio.set_event_loop_policy(asyncio.WindowsProactorEventLoopPolicy())
...