многопроцессорность python не может управлять несколькими длительно работающими консольными исполняемыми файлами?

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

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

Я публикую коды, как показано ниже:

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()

Спасибо за уделенное время!


person Mua    schedule 25.05.2011    source источник


Ответы (2)


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

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

И тогда это должно работать.

person Community    schedule 25.05.2011
comment
Я попробовал это. Это не работает. Получил ошибку в собственном модуле forking.py Python. - person Mua; 26.05.2011
comment
Я использовал именно то, что вы там написали. Но в моем имени файла есть пробел. потому что за ним следуют аргументы. Итак, мой cmd похож на *.exe xyz. У него нет проблем с subprocess.Popen. Но если я помещу всю строку cmd в аргумент multiprocessing.processing. Он сообщает об ошибке picklingerror - person Mua; 26.05.2011
comment
Попробовал еще раз без пробела в строке cmd. Только exe файл. Он все еще сообщает об этой ошибке. Я использую питон 2.6. - person Mua; 26.05.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)
person Ilker S    schedule 26.05.2011
comment
вы также можете добавить p.daemon = True перед p.start() - person Ilker S; 26.05.2011