¿Cómo se bloquea el proceso de trabajo mientras se espera que Value o Array se multipliquen?

Estadocument muestra un ejemplo para compartir el estado entre procesos usandoValue yArray desdemultiprocessing biblioteca:

desde el proceso de importación multiprocesamiento, valor, matriz

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]

Mis preguntas son

¿Cómo continúa pasando información al otro proceso en lugar de durante la creación del proceso de trabajo?

¿Cómo podría hacer que el proceso de trabajo bloquee (o suspenda) para esperar el evento del proceso principal a través de este mecanismo?

Mi plataforma es Windows 10. La memoria compartida podría compartirse entre procesos, pero los procesos fork () o spawn () no pueden heredar semáforos, bloqueos, colas, etc.

Gracias

[Actualización 1]

La demostración dada por @ Manu-Valdés funciona. Pero hice un ejemplo que no funciona, quizás podrías ayudar a detectar el problema.

%%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()

El error es

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