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.