Como você bloqueia um processo de trabalho enquanto aguarda o valor ou a matriz do multiprocessament

Estedocument mostra um exemplo para compartilhar estado entre processos usandoValue eArray a partir demultiprocessing biblioteca:

de importação de multiprocessamento Process, Value, Array

def f(n, a):
    n.value = 3.1415927
    for i in range(len(a)):
    a[i] = -a[i]

if __name__ == '__main__':
    num = Value('d', 0.0)
    arr = Array('i', range(10))

    p = Process(target=f, args=(num, arr))
    p.start()
    p.join()

    print(num.value)
    print(arr[:])

Imprimirá

3.1415927
[0, -1, -2, -3, -4, -5, -6, -7, -8, -9]

As minhas perguntas são

Como você continua a passar informações para o outro processo, e não durante a criação do processo de trabalh

Como você pode fazer com que o processo do trabalhador bloqueie (ou suspenda) a espera do evento do processo pai por meio desse mecanism

minha plataforma é o Windows 10. A memória compartilhada pode ser compartilhada entre os processos, mas os processos fork () ou spawn () não podem herdar semáforo, bloqueio, fila, et

Obrigado

[Atualização 1]

A demonstração dada por @ Manu-Valdés funciona. Mas eu fiz um exemplo não funciona, talvez você possa ajudar a identificar o problem

%%file ./examples/multiprocessing_pool5.py
# This code definitely will not work in Windows as queue object is not fork() along.
import multiprocessing
import os

def f1(q):
  x = q.get(True) # Block until something is in the queue
  if x == 55:
    raise Exception('I do not like 55!')
  elif x == 100:
    return
  else:
    print(f'f1({x}) -> {x*x}')


def f2(q):
  x = q.get(True) # Block until something is in the queue
  if x == 55:
    raise Exception('I do not like 55!')
  elif x == 100:
    return
  else:
    print(f'f2({x}) -> {x*x}')


def wp_init(q):
  #global queue
  #queue = q  # Point to the global queue in each process
  print(f'I am initialized')


def success_cb(result):
  print(f'Success returns = {result}')


def failure_cb(result):
  print(f'Failure returns = {result}')


if __name__ == '__main__':
  np = os.cpu_count()  # Number of cores per CPU
  queue = multiprocessing.Queue()
  pool = multiprocessing.Pool(np, initializer=wp_init, initargs=(queue,))

  for x in range(100):
    if x % 2 == 0:
      f = f1
    else:
      f = f2
  pool.apply_async(f, args=(queue,), callback=success_cb, error_callback=failure_cb)

  for x in range(100):
    queue.put(x)

  # Terminate them but I do not know how to loop through the processes
  for _ in range(100):
    queue.put(100)  # Terminate it

  pool.close()
  pool.join()

O erro é

I am initialized
I am initialized
I am initialized
I am initialized
Failure returns = Queue objects should only be shared between processes through inheritance

questionAnswers(2)

yourAnswerToTheQuestion