Многопроцессорная Python не может контролировать несколько долго работающих консольных EXE-файлов? - PullRequest
1 голос
/ 25 мая 2011

Я новичок в Python.Недавно я пытался использовать скрипт Python для вызова консоли exe, что требует длительного времени.Я позволю exe вызываться столько раз, сколько позволяет процессор.И когда exe закончил свою работу.Он должен освободить процессор для других новых заданий.Поэтому я думаю, что мне может понадобиться механизм управления несколькими процессами.

Поскольку многопроцессорная обработка может вызывать только вызываемую функцию Python.Он не может напрямую вызывать консоль exe.Я обернул подпроцесс.Popen (cmd) в функцию Python.Однако после этого я обнаружил, что перед использованием multiprocessing.Process.start () используется.Exe уже запущен.И проблема в том, что до того, как он закончит то, что он делает (нужно долгое время), он не возвращает мне контроль.Программа зависла, чтобы ждать.Это не то, что я хочу.

Я отправляю коды, как показано ниже:

import sys 

import os 

import multiprocessing 

import subprocess  

def subprocessExe(cmd):

        return subprocess.call(cmd, shell=False, stdout=subprocess.PIPE, \
                               stderr=subprocess.PIPE,creationflags=0x08000000)

if __name__ == '__main__': 

        p = multiprocessing.Process(target=self.subprocessExe(exeFileName))

        p.start()

        print p, p.is_alive()

Спасибо за ваше время!

Ответы [ 2 ]

2 голосов
/ 25 мая 2011

Вы вызываете subprocessExec, когда создаете объект multiprocessing.Process. Вместо этого вы должны сделать это:

p = multiprocessing.Process(target=subprocessExec, args=(exeFileName,))

А потом должно получиться.

1 голос
/ 26 мая 2011

В вашем тестовом примере есть ряд вещей, которые не соответствуют действительности. Следующая работа для меня:

import multiprocessing, subprocess

def subprocessExe(cmd):
   subprocess.call([cmd], shell=False)

p = multiprocessing.Process(target=subprocessExe, args=('/full/path/to/script.sh',))
p.start()

OR

subprocess.call([cmd], shell=True)
p = multiprocessing.Process(target=subprocessExe, args=('script.sh',))

OR

subprocess.Popen([cmd], shell=True, stdout=subprocess.PIPE, \
                               stderr=subprocess.PIPE)
...