Suponha que eu tenha o seguinte código:
from scipy import *
import multiprocessing as mp
num_cores = mp.cpu_count()
from joblib import Parallel, delayed
import matplotlib.pyplot as plt
def func(x,y):
return y/x
def main(y, xmin,xmax, dx):
x = arange(xmin,xmax,dx)
output = Parallel(n_jobs=num_cores)(delayed(func)(i, y) for i in x)
return x, asarray(output)
def demo():
x,z = main(2.,1.,30.,.1)
plt.plot(x,z, label='All values')
plt.plot(x[z>.1],z[z>.1], label='desired range') ## This is better to do in main()
plt.show()
demo()
Eu quero calcular a saída apenas até a saída> um determinado número (pode-se supor que os elementos da saída diminuam monotonicamente com o aumento de x) e depois pare (NÃO calculando todos os valores de x e depois classificando, isso é ineficiente para o meu objetivo). Existe alguma maneira de fazer isso usando paralelo, atrasado ou qualquer outro multiprocessamento?
python
python-3.x
python-multiprocessing
joblib
user247534
fonte
fonte
Respostas:
Não havia nenhum
output > a given number
especificado, então eu inventei um. após o teste, tive que reverter a condição para uma operação adequadaoutput < a given number
.Eu usaria um pool, iniciaria os processos com uma função de retorno de chamada para verificar a condição de parada e, em seguida, encerraria o pool quando estiver pronto. mas isso causaria uma condição de corrida que permitiria que os resultados fossem omitidos da execução de processos que não tinham permissão para concluir. Eu acho que esse método tem uma modificação mínima no seu código e é muito fácil de ler. A ordem da lista NÃO é garantida.
Prós: muito pouca sobrecarga
Contras: podem ter resultados ausentes.
Método 1)
Esse método possui mais sobrecarga, mas permitirá processos que começaram a terminar. Método 2)
Método 3) Prós: Nenhum resultado será deixado de lado
Contras: Este passo está muito além do que você normalmente faria.
pegue o método 1 e adicione
Então mude
stop_condition_callback
fonte
Eu usaria o Dask para executar em paralelo e, especificamente, a interface de futuros para feedback em tempo real dos resultados à medida que eles são concluídos. Quando terminar, você poderá cancelar os futuros restantes em andamento, conceder os desnecessários para concluir de forma assíncrona ou fechar o cluster.
Notas: - Suponho que você quis dizer "menor que", porque, caso contrário, o primeiro valor já passa (
y / xmin > 0.1
) - as saídas não são garantidas na ordem em que você as inseriu, se desejar buscar resultados à medida que ficarem prontos, mas com tal cálculo rápido, talvez sempre sejam (é por isso que a função retornou também o valor da entrada) - se você parar de calcular, a saída será mais curta que o conjunto completo de entradas, por isso não tenho certeza do que deseja impressão.fonte