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