Можно ли использовать tqdm для процесса, который не является oop? - PullRequest
2 голосов
/ 20 февраля 2020

Я пишу программу, в которой операция занимает несколько секунд (загрузка большого файла). К счастью, это всегда занимает одинаковое количество времени. Итак, ради пользователя, я хочу сделать индикатор выполнения. Тем не менее, tqdm, похоже, предназначен для циклов. Допустим, sleep(10) - это процесс, который требует времени. Как мне это решить?

Я хочу создать индикатор выполнения для длительного процесса, который не является oop.

from time import time, sleep
from tqdm import tqdm

for i in tqdm([1]):
    sleep(10)

Проблема с этот код заключается в том, что индикатор выполнения будет оставаться на нуле, а затем в конце процесса перейдет к 100%. Я хочу, чтобы индикатор прогресса развивался последовательно в течение 10 секунд.

Ответы [ 2 ]

1 голос
/ 20 февраля 2020

Вы можете использовать поток, чтобы загрузить файл, и от l oop до tqdm (диапазон (10)), пока файл не загрузится так:

import logging
import threading
import time
from tqdm import tqdm


def thread_function(name):
    logging.info("Thread %s: starting", name)
    logging.info("Main    : file loading...")
    time.sleep(5)
    logging.info("Thread %s: finishing", name)


if __name__ == "__main__":
    logging.basicConfig(format="%(asctime)s: %(message)s", level=logging.INFO,
                        datefmt="%H:%M:%S")

    x = threading.Thread(target=thread_function, args=(1,))
    x.start()
    for i in tqdm(range(10)):
        if not x.is_alive():
            break
        time.sleep(1)
    x.join()
    logging.info("Main    : end.")
0 голосов
/ 20 февраля 2020

Вы можете определить размер куска. Бар, который длится 10 секунд, предполагает, что вы уже знаете, сколько времени требуется для загрузки файла ...

Попробуйте это

from tqdm import tqdm_notebook as tqdm

chunk_size = 1000
total_chunks=nrows/chunk_size

chunks = pd.read_sql_query(query, connection, index_col='index_name',chunksize= chunk_size)
raw_train_data=pd.DataFrame()

with tqdm(total=total_chunks) as pbar:

    for chunk in chunks:
        raw_train_data = pd.concat([raw_train_data, chunk])
        pbar.update(1)
...