Я делаю проект, который собирает данные с датчиков клиентов, обрабатывает собранные данные и отправляет их клиентам. Может быть несколько клиентов, которые запрашивают данные с нашего сервера одновременно, поэтому мне пришлось реализовать многопроцессорность. Я не могу использовать потоки, потому что есть определенные переменные, которые должны быть независимыми от клиента. Если бы я это сделал, мой код, вероятно, стал бы очень сложным для чтения и обновления, и я этого не хочу. Поэтому я решил использовать процессы, но теперь есть некоторые данные, которые необходимо разделить между родительскими и дочерними процессами. После некоторых исследований я обнаружил, что связь по трубам будет отвечать моим требованиям.
Следующий код успешно отправляет данные из родительского процесса в дочерний процесс, дочерний процесс обновляет данные и отправляет их обратно в родительский процесс. Но он работает только из-за функции sleep (), которая не позволяет родительскому каналу использовать канал одновременно с дочерним.
Как его можно изменить, чтобы он делал то же самое, но без функции sleep (), для которой, я полагаю, это, скорее всего, вызовет проблемы в будущем?
from multiprocessing import Process, Pipe
import time
def update_data(pipe):
p_out, p_in = pipe
L = []
while True:
message = p_out.recv()
if message=='FINISHED':
break
L.append(message)
L.append(['new data']) #updating received data
writer(L, p_in) #sending received data to parent Process
p_in.close()
def writer(i, p_in):
p_in.send(i)
p_in.send('FINISHED')
L = ['0' for i in range(10)] #current data
if __name__=='__main__':
p_out, p_in = Pipe()
update_data_process = Process(target=update_data, args=((p_out, p_in),))
update_data_process.start()
writer(L, p_in) #sending current data to child Process
time.sleep(3) #needs to be changed
while True:
message = p_out.recv()
if message != 'FINISHED':
L = message
else:
break
print(L)
p_in.close()
update_data_process.join()