Ich habe eine riesige Liste, die ich verarbeiten muss, die einige Zeit dauert, also teile ich es in 4 Teile und multiprocess jedes Stück mit einer Funktion. Es dauert immer noch ein wenig Zeit, um mit 4 Kernen zu laufen, also dachte ich, ich würde der Funktion einen Fortschrittsbalken hinzufügen, so dass er mir sagen könnte, wo jeder Prozessor bei der Verarbeitung der Liste ist.Verwenden von click.progressbar mit Multiprocessing in Python
war mein Traum, so etwas zu haben:
erasing close atoms, cpu0 [######..............................] 13%
erasing close atoms, cpu1 [#######.............................] 15%
erasing close atoms, cpu2 [######..............................] 13%
erasing close atoms, cpu3 [######..............................] 14%
mit jeder Stab als Schleife bewegt sich in die Funktion fortschreitet. Aber stattdessen erhalte ich einen kontinuierlichen Fluss:
etc, füllen mein Terminal-Fenster.
Hier ist das Haupt Python-Skript, das die Funktion aufruft:
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]
Im Folgenden ist die Funktion 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)
Es ist ein Beispiel Repo auf das Sie interessant finden könnte: https://github.com/aaren/multi_progress –