- Я получаю данные из API, который здесь моделируется путем перебора массива целых чисел.
- Код запускает данные, поступающие из API, посредством длинного (почти) вычисления, которое здесь моделируется с помощью Process_the_data.
- После этого выходные данные записываются в файл база данных здесь смоделирована как write_to_sql.
Я получаю две основные ошибки: EOFError , Сломанная труба. Но после написания этой упрощенной версии я думаю, что что-то неправильно понял в модуле multiprocessing и/или классе Queue, потому что выходной_q никогда не записывается.
import multiprocessing
import random
import time
def process_the_data(in_q, out_q):
while True:
data = in_q.get(block=True)
time.sleep(random.choice([1,2,3]))
out_q.put_nowait(data + 1)
def write_to_sql(n):
print(n)
multiprocessing.set_start_method('fork')
mgr = multiprocessing.Manager()
input_q = mgr.Queue(maxsize=5)
output_q = mgr.Queue()
input_data = range(100)
p1 = multiprocessing.Process(target=process_the_data, args=(input_q, output_q))
p2 = multiprocessing.Process(target=process_the_data, args=(input_q, output_q))
p3 = multiprocessing.Process(target=process_the_data, args=(input_q, output_q))
p1.start()
p2.start()
p3.start()
for n in input_data:
# realized this loop is wrong but doesn’t change the behavior
while not input_q.full():
input_q.put(n)
while not output_q.empty():
write_to_sql(output_q.get(block=False))
p1.join()
p2.join()
p3.join()
print('finished')
Подробнее здесь: https://stackoverflow.com/questions/785 ... ot-running