세 개의 셸 스크립트 P1, P2 및 P3이 연결되어 있습니다. 이 세 개의 쉘 스크립트는 직렬로 실행해야하지만, 주어진 시간에 여러 개의 P1 및 P2와 P3이 실행될 수 있습니다.Queue, threading.Thread 및 subprocess가 너무 희박한 멀티 쓰레드 파이썬 스크립트가 왜
나는 이것을 수십 개의 파일에서 빠르게 실행해야하므로 스레드를 사용하고 병렬로 작업해야합니다.
저는 이것을 달성하기 위해 파이썬 스레드, 대기열 및 서브 프로세스 모듈을 사용하고 있습니다.
내 문제는 하나 이상의 스레드 수가있을 때 프로그램이 비정상적으로 작동하고 스레드가 재생 가능한 방식으로 서로 손을 놓지 않는다는 것입니다. 모두 다섯 스레드가 완벽하게 작동하고 완료 작업.
이것은 스레드를 사용하여 무언가를하는 첫 번째 시도이며 이것이 경쟁 조건과 관련된 스레드의 일반적인 문제로 인한 것임을 확신합니다. 하지만 어떻게 코드를 정리할 수 있는지 알고 싶습니다.
실제 코드는 (https://github.com/harijay/xtaltools/blob/master/process_multi.py)입니다. 가짜 코드는 아래와 같습니다. 죄송합니다 코드가 지저분한 경우.
내 질문에 왜 내가이 디자인을 사용하여 비정상적인 행동을합니까? 스레드는 주어진 시간에 모두 다른 파일에 액세스합니다. 또한 subprocess.call은 쉘 스크립트가 완료되고 생성 된 파일이 디스크에 기록 될 때만 반환됩니다.
어떻게해야합니까? 가능한 한 간결하게 설계를 설명하려고 노력했습니다.
내 기본 설계 : 이P1_Queue = Queue()
P2_Queue = Queue()
P3_Queue = Queue()
class P1_Thread(Thread):
def __init__(self,P1_Queue,P2_Queue):
Thread.__init__(self)
self.in_queue = P1_Queue
self.out_queue = P2_Queue
def run(self):
while True:
my_file_to_process = self.in_queue.get()
if my_file_to_process = None:
break
P1_runner = P1_Runner(my_file_to_process)
P1_runner.run_p1_using_subprocess()
self.out_queue.put(my_file_to_process)
클래스 P1 러너는 다음 입력 파일 핸들을 받아 파일 입력을 사용하고 사용하여 새 출력 파일을 생성하는 쉘 스크립트를 실행하는 subprocess.call()를 호출 run_p1_using_subprocess 메소드.
class P1_runner(object):
def __init__(self,inputfile):
self.my_shell_script = """#!/usr/bin/sh
prog_name <<eof
input 1
...
eof"""
self.my_shell_script_file = open("some_unique_p1_file_name.sh")
os.chmod("some_unique_file_name.sh",0755)
def run_p1_using_subprocess(self):
subprocess.call([self.my_shell_script_file])
I have essentially similar classes for P2 and P3 . All of which call a shell script that is custom generated
The chaining is achieved using a series of Thread Pools.
p1_worker_list = []
p2_worker_list = []
p3_worker_list = []
for i in range(THREAD_COUNT):
p1_worker = P1_Thread(P1_Queue,P2_Queue)
p1_worker.start()
p1_worker_list.append(p1_worker)
for worker in p1_worker_list:
worker.join()
And then again the same code block for p2 and p3
for i in range(THREAD_COUNT):
p2_worker = P2_Thread(P2_Queue,P3_Queue)
p2_worker.start()
p2_worker_list.append(p1_worker)
for worker in p2_worker_list:
worker.join()
도와 주셔서 감사합니다/조언을 톤 스레드의 종료 조건이 다른 스레드가 입력 큐를 비 웁니다 때 그들이 자살을하게
이것은 귀하의 코드가 아닙니다. 'if my_file_to_process = None :'은 구문 오류입니다. – Falmarri
죄송합니다. 설명을위한 코드였습니다. 구문 오류를 수정했습니다. – harijay