¿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