Posso usar uma fila de multiprocessamento em uma função chamada por Pool.imap?
Estou usando o python 2.7 e tentando executar algumas tarefas pesadas da CPU em seus próprios processos. Eu gostaria de poder enviar mensagens de volta ao processo pai para mantê-lo informado sobre o status atual do processo. A fila de multiprocessamento parece perfeita para isso, mas não consigo descobrir como fazê-lo funcionar.
Portanto, este é o meu exemplo básico de trabalho menos o uso de uma Fila.
import multiprocessing as mp
import time
def f(x):
return x*x
def main():
pool = mp.Pool()
results = pool.imap_unordered(f, range(1, 6))
time.sleep(1)
print str(results.next())
pool.close()
pool.join()
if __name__ == '__main__':
main()
Eu tentei passar a fila de várias maneiras e eles recebem a mensagem de erro "RuntimeError: objetos de fila só devem ser compartilhados entre processos por herança". Aqui está uma das maneiras que tentei com base em uma resposta anterior que encontrei. (Recebo o mesmo problema ao tentar usar Pool.map_async e Pool.imap)
import multiprocessing as mp
import time
def f(args):
x = args[0]
q = args[1]
q.put(str(x))
time.sleep(0.1)
return x*x
def main():
q = mp.Queue()
pool = mp.Pool()
results = pool.imap_unordered(f, ([i, q] for i in range(1, 6)))
print str(q.get())
pool.close()
pool.join()
if __name__ == '__main__':
main()
Finalmente, a abordagem de adequação 0 (global) não gera nenhuma mensagem, apenas trava.
import multiprocessing as mp
import time
q = mp.Queue()
def f(x):
q.put(str(x))
return x*x
def main():
pool = mp.Pool()
results = pool.imap_unordered(f, range(1, 6))
time.sleep(1)
print q.get()
pool.close()
pool.join()
if __name__ == '__main__':
main()
Estou ciente de que provavelmente funcionará com multiprocessamento. Processe diretamente e que existem outras bibliotecas para fazer isso, mas eu odeio me afastar das funções padrão da biblioteca que são ótimas, até ter certeza de que não é apenas minha falta de conhecimento, impedindo-me de explorá-los.
Obrigado.