Несколько процессов - Python - PullRequest
       2

Несколько процессов - Python

0 голосов
/ 20 ноября 2018

Я хочу запустить несколько экземпляров сценария командной строки одновременно.Я новичок в этой концепции "многопоточности", поэтому я немного растерялся относительно того, почему я вижу то, что вижу.

Я пытался выполнить вспомогательную обработку двумя различными способами:

1 - использование нескольких вызовов Popen без связи до конца:

command = 'raster2pgsql -I -C -e -s 26911 %s -t 100x100 -F p839.%s_image_sum_sum1 | psql -U david -d projects -h pg3' % (workspace + '\\r_sumsum1{}'.format(i), str(i))

process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)

command = 'raster2pgsql -I -C -e -s 26911 %s -t 100x100 -F p839.%s_image_sum_sum2 | psql -U david -d projects -h pg3' % (workspace + '\\r_sumsum2{}'.format(i), str(i))

process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)

command = 'raster2pgsql -I -C -e -s 26911 %s -t 100x100 -F p839.%s_image_sum_sum3 | psql -U david -d projects -h pg3' % (workspace + '\\r_sumsum3{}'.format(i), str(i))

process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)

(stdoutdata, stderrdata) = process.communicate()

thisзапускает каждый элемент командной строки, но завершает только последнюю запись, оставляя остальные 2 зависшими.

2 - Попытка реализовать пример из Поток Python для нескольких подпроцессов bash? , но ничего не происходит, кромедля распечатки команд (программа зависает без запуска аргументов командной строки, как это наблюдается в диспетчере задач Windows:

import threading
import Queue
import commands
import time

workspace = r'F:\Processing\SM'
image = 't08r_e'
image_name = (image.split('.'))[0]
i = 0
process_image_tif = workspace + '\\{}{}.tif'.format((image.split('r'))[0], str(i))

# thread class to run a command
class ExampleThread(threading.Thread):
    def __init__(self, cmd, queue):
        threading.Thread.__init__(self)
        self.cmd = cmd
        self.queue = queue

    def run(self):
        # execute the command, queue the result
        (status, output) = commands.getstatusoutput(self.cmd)
        self.queue.put((self.cmd, output, status))

# queue where results are placed
result_queue = Queue.Queue()

# define the commands to be run in parallel, run them
cmds = ['raster2pgsql -I -C -e -s 26911 %s -t 100x100 -F p839.%s_image_sum_sum1 | psql -U david -d projects -h pg3' % (workspace + '\\r_sumsum1{}'.format(i), str(i)),
        'raster2pgsql -I -C -e -s 26911 %s -t 100x100 -F p839.%s_image_sum_sum2 | psql -U david -d projects -h pg3' % (workspace + '\\r_sumsum2{}'.format(i), str(i)),
        'raster2pgsql -I -C -e -s 26911 %s -t 100x100 -F p839.%s_image_sum_sum3 | psql -U david -d projects -h pg3' % (workspace + '\\r_sumsum3{}'.format(i), str(i)),

       ]
for cmd in cmds:
    thread = ExampleThread(cmd, result_queue)
    thread.start()

# print results as we get them
while threading.active_count() > 1 or not result_queue.empty():
    while not result_queue.empty():
        (cmd, output, status) = result_queue.get()
        print(cmd)
        print(output)

Как я могу выполнить все эти команды одновременно, добившись результата в конце?Я бегу в Windows, Pyhton 2.7.

1 Ответ

0 голосов
/ 21 ноября 2018

Моя первая попытка не сработала из-за повторяющихся определений stdout и sterror.Удаление этих определений приводит к ожидаемому поведению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...