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

1

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

Поскольку многопроцессорность может вызывать только вызываемую функцию python. Он не может напрямую вызвать консоль exe. Я завернул subprocess.Popen(cmd) в функции python. Однако после того, как я это сделал, я обнаружил, что перед многопроцессорной обработкой используется метод .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()

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

Теги:
console
multiprocessing
subprocess
exe

2 ответа

2

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

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

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

  • 0
    Я попробовал это. Это не работает. Произошла ошибка в собственном модуле Pyking forking.py.
  • 0
    Я использовал именно то, что вы там написали. Но в моем имени файла есть пробел. потому что у него есть аргументы. Так что мой "cmd" похож на что-то "* .exe xyz". У него нет проблем с подпроцессом. Открыть. Но если я помещу всю строку "cmd" в аргумент multiprocessing.processing. Сообщите об ошибке «picklingerror»
Показать ещё 1 комментарий
1

В вашем тестовом случае существует множество ошибок. Следующая работа для меня:

import multiprocessing, subprocess

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

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

ИЛИ

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

ИЛИ

subprocess.Popen([cmd], shell=True, stdout=subprocess.PIPE, \
                               stderr=subprocess.PIPE)
  • 0
    Вы также можете добавить p.daemon = True перед p.start ()

Ещё вопросы

Сообщество Overcoder
Наверх
Меню