Python: threads para monitorar multiprocessamento

Introdução

A programação paralela pode ser feita usando abordagem multi-threading , multiprocessamento e híbrida . Às vezes pode ser útil monitorar e / ou interagir com multiprocessamento por meio de multithreading. Aqui eu dou um exemplo.

Caso de uso

Em um sistema de multiprocessamento, os trabalhadores produzem dados que devem ser armazenados a cada n segundos.

Precisamos de um processo de trabalho e um método de salvamento .
Os trabalhadores podem usar uma fila para armazenar dados.

import time
import threading
import multiprocessing

def worker(args):
data
= args[0]
queue
= args[1]
print 'Worker with data %d' % data
#...do stuff with your data...
time
.sleep(1.0)
queue
.put_nowait(data)

def save():
print 'Saving...'
with open("data.txt", "a") as file:
while not queue.empty():
file
.write("%dn" % queue.get())
if not workers.ready():
threading
.Timer(0.2, save).start()

Usando o multiprocessing.Manager (). Queue () é possível armazenar e compartilhar dados entre processos e threads.

Um uso simples dele:

manager = multiprocessing.Manager()
queue
= manager.Queue()
pool
= multiprocessing.Pool(4)
workers
= pool.map_async(worker, [(data, queue) for data in range(10)])
save
()

Na função save () , o truque é reprogramar a si mesmo se os trabalhadores ainda estiverem funcionando: Isso não é recursão!

Exercício: tente modificar a assinatura da função save () para aceitar as variáveis queue e workers como argumento.