python3에서 여러 프로세스를 실행하는 데 문제가 있습니다.python3을 사용한 다중 처리는 한 번만 실행됩니다.
내 프로그램은 다음을 수행합니다 1. 출력에 결과를 sqllite 데이터베이스에서 항목을 가져 와서 2. input_queue 일회성 항목을 여러 프로세스를 만들기 input_queue에 전달하는 기능과 출력을 통해 실행 열. 3. output_queue에서 항목을 가져 와서 스레드를 만듭니다.이 스레드는 분명히 처음 두 단계 전에 시작됩니다.
제 2 단계의 '함수'는 현재 여러 번 실행됩니다. 프로세스 수를 설정합니다. 예를 들어 프로세스 수를 8로 설정하면 8 번만 실행 한 다음 중지합니다. input_queue에서 모든 항목을 지울 때까지 실행을 계속한다고 가정했습니다.
데이터베이스에서 항목을 가져 오는 기능 (1 단계)을 다른 프로세스로 다시 작성한 다음 출력 대기열을 2 단계의 입력 대기열로 전달해야합니까?
편집 : 다음은 코드의 예입니다. 데이터베이스 항목의 대체로 숫자 목록을 사용하여 같은 방식으로 수행합니다. 나는 목록에있는 300 개 항목이와 나는 모두 300 개 항목을 처리하고 싶지만, 지금은 10 (I가 할당 한 프로세스의 수) 처리
#!/usr/bin/python3
from multiprocessing import Process,Queue
import multiprocessing
from threading import Thread
## This is the class that would be passed to the multi_processing function
class Processor:
def __init__(self,out_queue):
self.out_queue = out_queue
def __call__(self,in_queue):
data_entry = in_queue.get()
result = data_entry*2
self.out_queue.put(result)
#Performs the multiprocessing
def perform_distributed_processing(dbList,threads,processor_factory,output_queue):
input_queue = Queue()
# Create the Data processors.
for i in range(threads):
processor = processor_factory(output_queue)
data_proc = Process(target = processor,
args = (input_queue,))
data_proc.start()
# Push entries to the queue.
for entry in dbList:
input_queue.put(entry)
# Push stop markers to the queue, one for each thread.
for i in range(threads):
input_queue.put(None)
data_proc.join()
output_queue.put(None)
if __name__ == '__main__':
output_results = Queue()
def output_results_reader(queue):
while True:
item = queue.get()
if item is None:
break
print(item)
# Establish results collecting thread.
results_process = Thread(target = output_results_reader,args = (output_results,))
results_process.start()
# Use this as a substitute for the database in the example
dbList = [i for i in range(300)]
# Perform multi processing
perform_distributed_processing(dbList,10,Processor,output_results)
# Wait for it all to finish.
results_process.join()
디버깅을 원하면 코드를 제시해야합니다. 이상적으로 우리에게 [SSCCE] (http : // sscce.org)는 여러분이하려는 일과 잘못되는 일을 보여주기에 충분할 정도로 박탈되었습니다. – abarnert
하지만 당신이 잘못 작성한 코드는 어쨌든 작성 될 필요가 없으며,'multiprocessing.Pool' 또는'concurrent.futures.ProcessPoolExecutor'는 자동으로 필요한 모든 것을 할 것입니다. – abarnert
답장을 보내 주셔서 감사합니다. 질문에 코드를 추가했습니다. 수영장이 내가 가지고있는 것과 함께 작동하는지 확실하지 않습니다. 편집이 필요한 줄은 content_table을 반복하는 것입니다. – Lezan