Tentei ler a documentação em http://docs.python.org/dev/library/multiprocessing.html, mas ainda estou lutando com o multiprocessamento Queue, Pool e Locking. E, por enquanto, consegui construir o exemplo abaixo.
Em relação à Fila e ao Pool, não tenho certeza se entendi o conceito da maneira certa, então me corrija se estiver errado. O que estou tentando alcançar é processar 2 solicitações de cada vez (a lista de dados tem 8 neste exemplo), então, o que devo usar? Pool para criar 2 processos que podem lidar com duas filas diferentes (2 no máximo) ou devo apenas usar a Queue para processar 2 entradas de cada vez? O bloqueio seria imprimir as saídas corretamente.
import multiprocessing
import time
data = (['a', '2'], ['b', '4'], ['c', '6'], ['d', '8'],
['e', '1'], ['f', '3'], ['g', '5'], ['h', '7']
)
def mp_handler(var1):
for indata in var1:
p = multiprocessing.Process(target=mp_worker, args=(indata[0], indata[1]))
p.start()
def mp_worker(inputs, the_time):
print " Processs %s\tWaiting %s seconds" % (inputs, the_time)
time.sleep(int(the_time))
print " Process %s\tDONE" % inputs
if __name__ == '__main__':
mp_handler(data)
fonte
var1
completamente, referindo-me a globaldata
.Isso pode não estar 100% relacionado à pergunta, mas na minha pesquisa por um exemplo de uso de multiprocessamento com uma fila, isso apareceu primeiro no google.
Este é um exemplo básico de classe que você pode instanciar e colocar itens em uma fila e pode esperar até que a fila termine. Isso é tudo que eu precisava.
fonte
item1
eitem2
? São algum tipo de tarefa ou função, que será executada em dois processos diferentes?Aqui está meu goto pessoal para este tópico:
Síntese aqui, (solicitações de pull bem-vindas!): Https://gist.github.com/thorsummoner/b5b1dfcff7e7fdd334ec
fonte
get()
é um tempo limite, não tem nada a ver com o número de jobs que são iniciados..get(timeout=1)
? e está certo apenas dizer.get()
para obter a lista completa?.get()
aguarda indefinidamente até que todos os resultados estejam disponíveis e retorna a lista de resultados. Você pode usar um loop de pesquisa para verificar se os resultados do clima estão disponíveis ou pode passar uma função de retorno de chamada namap_async()
chamada que será invocada para cada resultado assim que estiver disponível.Para todos que usam editores como o Komodo Edit (win10), adicione
sys.stdout.flush()
a:ou como primeira linha para:
Isso ajuda a ver o que acontece durante a execução do script; em vez de olhar para a caixa preta da linha de comando.
fonte
Aqui está um exemplo do meu código (para pool encadeado, mas apenas altere o nome da classe e você terá o pool de processos):
Basicamente:
pool = ThreadPoolExecutor(6)
cria um pool para 6 threadspool.submit(execute_run, rp)
adiciona uma tarefa ao pool, primeiro um argumento é uma função chamada em um thread / processo, o restante dos argumentos são passados para a função chamada.pool.join
aguarda até que todas as tarefas sejam concluídas.fonte
concurrent.futures
, mas o OP está perguntando sobremultiprocessing
e Python 2.7.