Ho una lista enorme che devo elaborare, che richiede un po 'di tempo, quindi la divido in 4 parti e multiprocesso ogni pezzo con una qualche funzione. Ci vuole ancora un po 'di tempo per girare con 4 core, quindi ho pensato di aggiungere una barra di avanzamento alla funzione, in modo che potesse dirmi dove si trova ciascun processore durante l'elaborazione dell'elenco.Uso di click.progressbar con multiprocessing in Python
Il mio sogno era quello di avere qualcosa di simile:
erasing close atoms, cpu0 [######..............................] 13%
erasing close atoms, cpu1 [#######.............................] 15%
erasing close atoms, cpu2 [######..............................] 13%
erasing close atoms, cpu3 [######..............................] 14%
con ogni barra in movimento, come il ciclo nella funzione progredisce. Ma invece, ho un flusso continuo:
ecc, riempiendo la mia finestra di terminale.
Ecco lo script python principale che chiama la funzione:
from eraseCloseAtoms import *
from readPDB import *
import multiprocessing as mp
from vectorCalc import *
prot, cell = readPDB('file')
atoms = vectorCalc(cell)
output = mp.Queue()
# setup mp to erase grid atoms that are too close to the protein (dmin = 2.5A)
cpuNum = 4
tasks = len(atoms)
rangeSet = [tasks/cpuNum for i in range(cpuNum)]
for i in range(tasks % cpuNum):
rangeSet[i] += 1
rangeSet = np.array(rangeSet)
processes = []
for c in range(cpuNum):
na, nb = (int(np.sum(rangeSet[:c] + 1)), int(np.sum(rangeSet[:c + 1])))
processes.append(mp.Process(target=eraseCloseAtoms, args=(prot, atoms[na:nb], cell, 2.7, 2.5, output)))
for p in processes:
p.start()
results = [output.get() for p in processes]
for p in processes:
p.join()
atomsNew = results[0] + results[1] + results[2] + results[3]
Di seguito è la funzione eraseCloseAtoms()
:
import numpy as np
import click
def eraseCloseAtoms(protein, atoms, cell, spacing=2, dmin=1.4, output=None):
print 'just need to erase close atoms'
if dmin > spacing:
print 'the spacing needs to be larger than dmin'
return
grid = [int(cell[0]/spacing), int(cell[1]/spacing), int(cell[2]/spacing)]
selected = list(atoms)
with click.progressbar(length=len(atoms), label='erasing close atoms') as bar:
for i, atom in enumerate(atoms):
bar.update(i)
erased = False
coord = np.array(atom[6])
for ix in [-1, 0, 1]:
if erased:
break
for iy in [-1, 0, 1]:
if erased:
break
for iz in [-1, 0, 1]:
if erased:
break
for j in protein:
protCoord = np.array(protein[int(j)][6])
trueDist = getMinDist(protCoord, coord, cell, vectors)
if trueDist <= dmin:
selected.remove(atom)
erased = True
break
if output is None:
return selected
else:
output.put(selected)
C'è un esempio di pronti contro termine su questo si potrebbe trovare interessante: https://github.com/aaren/multi_progress –