Python в Windows - как ожидать нескольких дочерних процессов?

Используйте петлю while.

Почему while loop?

Обычно мы должны использовать while циклы всегда, когда мы не знаем, сколько циклов мы сделаем. В этом случае только когда пользователь вводит «stop».

Итак, вам нужно поле String для хранения слов пользователя. Также мы можем использовать числовое поле, чтобы отследить, является ли первое или второе слово, подумав, добавив слово «не».

Затем посмотрите на этот пример:

Scanner s = new Scanner(System.in);
String currentAnswer = "";
String userWords = "";
int tracker = 0;

while (!currentAnswer.equals("stop")){
     currentAnswer = s.nextLine();
     userWords += currentAnswer + " ";

     if (tracker % 2 != 0) {
         userWords += "not ";
     }

     tracker++;
}

System.put.println(userWords);

Это можно сделать и с помощью цикла for, но я действительно рекомендую цикл while для этого случая.

РЕДАКТИРОВАТЬ: Как вы видели, я использовал equals() вместо ==, чтобы сравнить две строки, потому что мы хотим проверить его значение, а не равенство объектов.

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

Для этого случая справедливо знать, что мы можем сравнить его, используя другие способы, такие как Objects.equals() или даже contentEquals().

Проверьте это обсуждение , чтобы узнать больше о сравнении строк.

21
задан Rafał Dowgird 19 September 2008 в 09:02
поделиться

4 ответа

Это могло бы казаться излишеством, но, здесь это идет:

import Queue, thread, subprocess

results= Queue.Queue()
def process_waiter(popen, description, que):
    try: popen.wait()
    finally: que.put( (description, popen.returncode) )
process_count= 0

proc1= subprocess.Popen( ['python', 'mytest.py'] )
thread.start_new_thread(process_waiter,
    (proc1, "1 finished", results))
process_count+= 1

proc2= subprocess.Popen( ['python', 'mytest.py'] )
thread.start_new_thread(process_waiter,
    (proc2, "2 finished", results))
process_count+= 1

# etc

while process_count > 0:
    description, rc= results.get()
    print "job", description, "ended with rc =", rc
    process_count-= 1
14
ответ дан 29 November 2019 в 21:24
поделиться

Скрученный в Windows выполнит активное ожидание под покрытиями. Если Вы не хотите использовать потоки, необходимо будет использовать win32 API, чтобы не опрашивать. Что-то вроде этого:

import win32process
import win32event

# Note: CreateProcess() args are somewhat cryptic, look them up on MSDN
proc1, thread1, pid1, tid1 = win32process.CreateProcess(...)
proc2, thread2, pid2, tid2 = win32process.CreateProcess(...)
thread1.close()
thread2.close()

processes = {proc1: "proc1", proc2: "proc2"}

while processes:
    handles = processes.keys()
    # Note: WaitForMultipleObjects() supports at most 64 processes at a time
    index = win32event.WaitForMultipleObjects(handles, False, win32event.INFINITE)
    finished = handles[index]
    exitcode = win32process.GetExitCodeProcess(finished)
    procname = processes.pop(finished)
    finished.close()
    print "Subprocess %s finished with exit code %d" % (procname, exitcode)
4
ответ дан 29 November 2019 в 21:24
поделиться

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

5
ответ дан 29 November 2019 в 21:24
поделиться

Основываясь на ответе zseil, можно сделать это с соединением подпроцесса и win32 вызовов API. Я использовал прямой ctypes, потому что мой Python, оказывается, не имеет установленный win32api. Я просто порождаю sleep.exe от MSYS здесь как пример, но ясно Вы могли породить любой процесс, который Вы любите. Я использую OpenProcess (), чтобы заставить ДЕСКРИПТОР от PID процесса и затем WaitForMultipleObjects ожидать любого процесса для окончания.

import ctypes, subprocess
from random import randint
SYNCHRONIZE=0x00100000
INFINITE = -1
numprocs = 5
handles = {}

for i in xrange(numprocs):
    sleeptime = randint(5,10)
    p = subprocess.Popen([r"c:\msys\1.0\bin\sleep.exe", str(sleeptime)], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=False)
    h = ctypes.windll.kernel32.OpenProcess(SYNCHRONIZE, False, p.pid)
    handles[h] = p.pid
    print "Spawned Process %d" % p.pid

while len(handles) > 0:
    print "Waiting for %d children..." % len(handles)
    arrtype = ctypes.c_long * len(handles)
    handle_array = arrtype(*handles.keys())
    ret = ctypes.windll.kernel32.WaitForMultipleObjects(len(handle_array), handle_array, False, INFINITE)
    h = handle_array[ret]
    ctypes.windll.kernel32.CloseHandle(h)
    print "Process %d done" % handles[h]
    del handles[h]
print "All done!"
5
ответ дан 29 November 2019 в 21:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: