Почему блокируется выполение процесса при передачи данных через функцию 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 ...

Подскажите как мне передавать переменную чтобы выполнялось все параллельно?


Ответы (0 шт):