Es gab viele ähnliche Geschichten (offizielle Übersetzung / Überarbeitung?) Über die asynchrone Ausführung von Python. Es ist schwer für einen alten Mann, der einen harten Kopf hat, also habe ich nach Beispielen gesucht und Websites in mehreren Sprachen angesehen und mich schließlich durch Versuch und Irrtum bewegt, also habe ich versucht, nur mein Herz zusammenzufassen.
Alle Beispiele sind Muster für die Ausführung externer Befehle unter Windows Es gibt fast keinen Kommentar.
Einfach und nett. Das hat sich Ojisan ausgedacht.
pid.py
import subprocess
from time import sleep
procs = {}
for h in servers:
p = subprocess.Popen(["some", "command"], ...)
# subprocess.renne zu stdout=Es scheint mit PIPE zu funktionieren, wurde aber nicht untersucht
procs[p.pid] = p
while procs:
for pid in list(procs):
if procs[pid].poll in not None:
del procs[pid]
sleep(x)
procs kann eine Liste von p vom Ende sein, Mein Favorit ist es, es am Ende mit dieser Methode zu leeren.
Dies ist in Ordnung, wenn das auszuführende Ziel etwas generiert. Die Ausführungsfunktion ist ein asynchrones Ausführungsziel. Als ich es zum ersten Mal gemacht habe, habe ich es mit run_until_complete aufgerufen, also habe ich mich gefragt, ob es nur mit create_subprocess_shell warten würde.
async1.py
import asyncio
from asyncoio.subprocess import DEVNULL
async def run(param):
#Eine der beiden folgenden Arbeiten
p = await asyncio.create_subprocess_exec(*["some", "command", param],
stdout=DEVNULL, ...)
p = await asyncio.create_subprocess_shell("some command %s" % param,
stdout=DEVNULL, ...)
await p.wait()
if sys.platform.startswith('win'):
loop = asyncio.ProactorEventLoop()
asyncio.set_event_loop(loop)
else:
loop = asyncio.get_event_loop()
funcs = asyncio.gather(*[run(p) for p in parameters])
loop.run_until_complete(funcs)
Hier können Sie mit der auszuführenden Standardausgabe etwas unternehmen. Die Ergebnisse werden jedoch in der Reihenfolge des Endes an das Haupt-Ret zurückgegeben, sodass Sie es ertragen müssen.
async_stdout.py
import asyncio
from asyncoio.subprocess import PIPE
import sys
async def run(param):
p = await asyncio.create_subprocess_shell("some command %s" param,
stdout=PIPE, ...)
return await (p.communicate())[0].decode('code').splitlines()
async def main():
funcs = asyncio.gather(*[run(p) for p in parameters]*)
for f in asyncio.as_completed(funcs):
ret = await f
if sys.platform.startswith('win'):
loop = asyncio.ProactorEventLoop()
asyncio.set_event_loop(loop)
else:
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
Ich habe das Gefühl, ich schreibe nur etwas Ähnliches. Werde ich als nächstes über openpyxl schreiben?
Recommended Posts