Добавление ProgressBar в многопоточный скрипт Python - PullRequest
0 голосов
/ 13 апреля 2020

Я пытаюсь добавить индикатор прогресса в мой сценарий, но у меня не получилось, потому что я думаю, что он многопоточный или, возможно, его следует добавить в отдельный поток. я нашел множество решений в stackoverflow, например, библиотеку tqdm, но я не смог ее реализовать, также я думаю, что у меня есть путаница, когда именно мне нужно реализовать индикатор выполнения, чтобы он работал.

это мой код:

# -*- coding: utf-8 -*
from __future__ import unicode_literals
# !/usr/bin/python
import  codecs
from multiprocessing.dummy import Pool

start_raw = "myfile"
threads = 10

with codecs.open(start_raw, mode='r', encoding='ascii', errors='ignore') as f:
    lists = f.read().splitlines()
    lists = list((lists))


def myfunction(x):
    try:
        print x

    except:
        pass


def Main():
    try:
        pp = Pool(int(threads))
        pr = pp.map(myfunction, lists)


    except:
        pass


if __name__ == '__main__':
    Main()




я пробовал это решение { ссылка }:

# -*- coding: utf-8 -*
from __future__ import unicode_literals
# !/usr/bin/python
import  codecs
from multiprocessing.dummy import Pool
import tqdm

start_raw = "myfile"
threads = 1

with codecs.open(start_raw, mode='r', encoding='ascii', errors='ignore') as f:
    lists = f.read().splitlines()
    lists = list((lists))


def myfunction(x):
    try:
        print (x)

    except:
        pass

def Main():
    try:
        pp = Pool(int(threads))
        pr = pp.map(myfunction, lists)


    except:
        pass


if __name__ == '__main__':
    with Pool(2) as p:
        r = list(tqdm.tqdm(p.imap(Main(), range(30)), total=30))

, но код не запускается, и я получаю исключение (TypeError: 'NoneType 'объект не вызывается)

0%|                                                                                           | 0/30 [00:00<?, ?it/s]Traceback (most recent call last):
  File "file.py", line 35, in <module>
    r = list(tqdm.tqdm(p.imap(Main(), range(30)), total=30))
  File "C:\mypath\Python\Python38-32\lib\site-packages\tqdm\std.py", line 1118, in __iter__
    for obj in iterable:
  File "C:\mypath\Python\Python38-32\lib\multiprocessing\pool.py", line 865, in next
    raise value
  File "C:\mypath\Python\Python38-32\lib\multiprocessing\pool.py", line 125, in worker
    result = (True, func(*args, **kwds))
TypeError: 'NoneType' object is not callable
  0%|                                                                                           | 0/30 [00:00<?, ?it/s]


1 Ответ

0 голосов
/ 14 апреля 2020

Полагаю, вы хотели передать myfunction вместо Main в imap, в соответствии с первым примером.

Когда вы передаете Main() в p.imap в r = list(tqdm.tqdm(p.imap(Main(), range(30)), total=30)), Python вызывает метод Main и передает возвращаемое значение в качестве первого аргумента imap.

Вы должны удалить скобки после Main как: p.imap в r = list(tqdm.tqdm(p.imap(Main, range(30)), total=30)).

...