Pythonのマルチプロセッシングでclick.progressbarを使用する

硝酸ナトリウム

処理する必要のある膨大なリストがあり、時間がかかるので、4つに分割して、それぞれの部分を何らかの機能でマルチプロセスします。4コアで実行するにはまだ少し時間がかかるので、リストの処理で各プロセッサがどこにあるかを教えてくれるように、関数にプログレスバーを追加することにしました。

私の夢はこのようなものを持つことでした:

erasing close atoms, cpu0  [######..............................]  13%
erasing close atoms, cpu1  [#######.............................]  15%
erasing close atoms, cpu2  [######..............................]  13%
erasing close atoms, cpu3  [######..............................]  14%

関数のループが進むにつれて、各バーが移動します。しかし、代わりに、私は継続的な流れを得る:

ここに画像の説明を入力してください

など、ターミナルウィンドウを埋めます。

関数を呼び出すメインのPythonスクリプトは次のとおりです。

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]

以下は関数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)
Blckknght

コードに2つの問題があります。

The first one explains why your progress bars are often showing 100% rather than their real progress. You're calling bar.update(i) which advances the bar's progress by i steps, when I think you want to be updating by one step. A better approach would be to pass the iterable to the progressbar function and let it do the updating automatically:

with click.progressbar(atoms, label='erasing close atoms') as bar:
    for atom in bar:
        erased = False
        coord = np.array(atom[6])

        # ...

However, this still won't work with multiple processes iterating at once, each with its own progress bar due to the second issue with your code. The click.progressbar documentation states the following limitation:

No printing must happen or the progress bar will be unintentionally destroyed.

This means that whenever one of your progress bars updates itself, it will break all of the other active progress bars.

これを簡単に修正できるとは思いません。複数行のコンソール出力をインタラクティブに更新することは非常に困難です(基本的に、OSのサポートを受けてcursesまたは同様の「コンソールGUI」ライブラリを使用する必要があります)。clickモジュールは、それだけで現在の行を更新することができ、その機能を持っていません。次のように、click.progressbarデザインを拡張して複数のバーを列に出力することをお勧めします。

CPU1: [######      ] 52%   CPU2: [###        ] 30%    CPU3: [########  ] 84%

これを機能させるには、重要な量のコードが必要になりますが(特に、更新が複数のプロセスから行われる場合)、完全に実用的ではありません。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Pythonでのマルチプロセッシングを使用したForループ

分類Dev

プールを使用したPythonでのマルチプロセッシング

分類Dev

forループでマルチプロセッシングを使用する方法-python

分類Dev

Pythonでのマルチプロセッシングプールの使用

分類Dev

マルチプロセッシングでkerasを使用する

分類Dev

runpyでマルチプロセッシングを使用する

分類Dev

Python(Cookie Clicker)を使用したSeleniumでのマルチプロセッシング

分類Dev

slurmでのPythonのマルチプロセッシングの使用

分類Dev

Pythonでマルチプロセッシングキューを使用する方法

分類Dev

マルチプロセッシングでPythonとOpenCVを使用する方法は?

分類Dev

Pythonマルチプロセッシングでhylangを使用する例

分類Dev

Pythonマルチプロセッシングを試みるWindowsでのRuntimeError

分類Dev

Pythonマルチプロセッシングを試みるWindowsでのRuntimeError

分類Dev

Pythonでのマルチプロセッシングにプールを使用する(Windows)

分類Dev

PythonマルチプロセッシングでのOMP_NUM_THREADS = 1の使用

分類Dev

PyarrowsのHdfsClientでマルチプロセッシングを使用する

分類Dev

Pythonマルチプロセッシング。virtualenvを使用するプロセス

分類Dev

Python3でのファイル読み取りにマルチプロセッシングを使用する

分類Dev

Pythonマルチプロセッシング:最初の子エラーでマップを中止する

分類Dev

Pythonマルチプロセッシングでの合計CPU使用率を制限する

分類Dev

Python3で複数のmap_async(マルチプロセッシング)を使用する

分類Dev

PythonでExcelファイルをループに保存するときのマルチプロセッシング

分類Dev

Python:マップとマルチプロセッシングの使用

分類Dev

Pythonマルチプロセッシング:マルチプロセッシングを使用すると、一部のクラス属性が失われます

分類Dev

Python:プールを使用したマルチプロセッシングで「intnotcallable」

分類Dev

Chromeの問題を使用したPython3でのセレンのマルチプロセッシング

分類Dev

結果を辞書に追加するforループでPythonマルチプロセッシングを使用する

分類Dev

Pythonのforループでマルチプロセッシング技術を適用する方法は?

分類Dev

Pythonマルチプロセッシングでグローバル/共通変数を使用する方法

Related 関連記事

  1. 1

    Pythonでのマルチプロセッシングを使用したForループ

  2. 2

    プールを使用したPythonでのマルチプロセッシング

  3. 3

    forループでマルチプロセッシングを使用する方法-python

  4. 4

    Pythonでのマルチプロセッシングプールの使用

  5. 5

    マルチプロセッシングでkerasを使用する

  6. 6

    runpyでマルチプロセッシングを使用する

  7. 7

    Python(Cookie Clicker)を使用したSeleniumでのマルチプロセッシング

  8. 8

    slurmでのPythonのマルチプロセッシングの使用

  9. 9

    Pythonでマルチプロセッシングキューを使用する方法

  10. 10

    マルチプロセッシングでPythonとOpenCVを使用する方法は?

  11. 11

    Pythonマルチプロセッシングでhylangを使用する例

  12. 12

    Pythonマルチプロセッシングを試みるWindowsでのRuntimeError

  13. 13

    Pythonマルチプロセッシングを試みるWindowsでのRuntimeError

  14. 14

    Pythonでのマルチプロセッシングにプールを使用する(Windows)

  15. 15

    PythonマルチプロセッシングでのOMP_NUM_THREADS = 1の使用

  16. 16

    PyarrowsのHdfsClientでマルチプロセッシングを使用する

  17. 17

    Pythonマルチプロセッシング。virtualenvを使用するプロセス

  18. 18

    Python3でのファイル読み取りにマルチプロセッシングを使用する

  19. 19

    Pythonマルチプロセッシング:最初の子エラーでマップを中止する

  20. 20

    Pythonマルチプロセッシングでの合計CPU使用率を制限する

  21. 21

    Python3で複数のmap_async(マルチプロセッシング)を使用する

  22. 22

    PythonでExcelファイルをループに保存するときのマルチプロセッシング

  23. 23

    Python:マップとマルチプロセッシングの使用

  24. 24

    Pythonマルチプロセッシング:マルチプロセッシングを使用すると、一部のクラス属性が失われます

  25. 25

    Python:プールを使用したマルチプロセッシングで「intnotcallable」

  26. 26

    Chromeの問題を使用したPython3でのセレンのマルチプロセッシング

  27. 27

    結果を辞書に追加するforループでPythonマルチプロセッシングを使用する

  28. 28

    Pythonのforループでマルチプロセッシング技術を適用する方法は?

  29. 29

    Pythonマルチプロセッシングでグローバル/共通変数を使用する方法

ホットタグ

アーカイブ