Почему блокируется выполение процесса при передачи данных через функцию PIPE в multiprocessing в Python 3
Всем привет, есть код, в качестве web сервер aiohttp:
#!/usr/bin/python3
from multiprocessing import Process, current_process, Queue, Pipe
import time
import pymysql.cursors
import multiprocessing
import asyncio
from aiohttp import web
def count_down(name, delay, child_conn):
p = current_process()
print('Starting process %s, ID %s ...' % (name, p.pid))
counter = 5
while counter:
time.sleep(delay)
print('Process %s counting down: %i... ID %s ...' % (name, counter, p.pid))
counter -= 1
child_conn.send(101)
print('Process %s exiting... ID %s ...' % (name,p.pid))
async def start_worker_1(request):
parent_conn, child_conn = Pipe()
post = await request.json()
process1 = Process(target=count_down, args=('A', 2.5, child_conn,))
process1.start()
message=parent_conn.recv()
print('Результат процесса ', message)
parent_conn.close()
child_conn.close()
###тестирвоаниие многопоточности
app = web.Application()
app.add_routes([web.post('/query', start_worker_1)])
web.run_app(app, port=8083)
Вывод выполнения:
Starting process A, ID 55 ...
Process A counting down: 5... ID 55 ...
Process A counting down: 4... ID 55 ...
Process A counting down: 3... ID 55 ...
Process A counting down: 2... ID 55 ...
Process A counting down: 1... ID 55 ...
Process A exiting... ID 55 ...
Результат процесса 101
Starting process A, ID 56 ...
Process A counting down: 5... ID 56 ...
Process A counting down: 4... ID 56 ...
Process A counting down: 3... ID 56 ...
Process A counting down: 2... ID 56 ...
Process A counting down: 1... ID 56 ...
Результат процесса 101
Process A exiting... ID 56 ...
как видно хоть этот код и должен выполняться в 2 ручья, но нет, вся проблема в передачи данных из процесса:
message=parent_conn.recv()
Когда я жду переменную то все идет синхронно, как только я убираю считывания переменной из процесса, то все летает, вот код:
#!/usr/bin/python3
from multiprocessing import Process, current_process, Queue, Pipe
import time
import pymysql.cursors
import multiprocessing
import asyncio
from aiohttp import web
def count_down(name, delay, child_conn):
p = current_process()
print('Starting process %s, ID %s ...' % (name, p.pid))
counter = 5
while counter:
time.sleep(delay)
print('Process %s counting down: %i... ID %s ...' % (name, counter, p.pid))
counter -= 1
child_conn.send(101)
print('Process %s exiting... ID %s ...' % (name,p.pid))
async def start_worker_1(request):
parent_conn, child_conn = Pipe()
post = await request.json()
process1 = Process(target=count_down, args=('A', 2.5, child_conn,))
process1.start()
#message=parent_conn.recv()
#print('Результат процесса ', message)
parent_conn.close()
child_conn.close()
###тестирвоаниие многопоточности
app = web.Application()
app.add_routes([web.post('/query', start_worker_1)])
web.run_app(app, port=8083)
И вот как теперь все параллельно выполняется:
Starting process A, ID 61 ...
Starting process A, ID 62 ...
Process A counting down: 5... ID 61 ...
Process A counting down: 5... ID 62 ...
Process A counting down: 4... ID 61 ...
Process A counting down: 4... ID 62 ...
Process A counting down: 3... ID 61 ...
Process A counting down: 3... ID 62 ...
Process A counting down: 2... ID 61 ...
Process A counting down: 2... ID 62 ...
Process A counting down: 1... ID 61 ...
Process A exiting... ID 61 ...
Process A counting down: 1... ID 62 ...
Process A exiting... ID 62 ...
Подскажите как мне передавать переменную чтобы выполнялось все параллельно?