Я запускаю некоторые задания параллельно, что иногда может занять много времени, поэтому я хочу, чтобы основной поток сообщал о ходе выполнения. Например, каждый час.
Ниже приведена упрощенная версия того, что я придумал. Код будет выполняться test_function
в 2 потоках с аргументами из input_arguments
. Каждые 5 секунд он будет печатать % выполненных заданий.
import threading
import queue
import time
def test_function(x):
time.sleep(4)
print("Finished ", x)
num_processes = 2
input_arguments = range(10)
# Define a worker which will continuously execute function taking input parameters from the queue
def worker():
while True:
x = q.get()
if x is None:
break
test_function(x)
q.task_done()
# Initialize queue and the threads
q = queue.Queue()
threads = []
for i in range(num_processes):
t = threading.Thread(target=worker)
t.start()
threads.append(t)
# Create a queue of input parameters for function
for item in input_arguments:
q.put(item)
# Report progress every 5 seconds
report_progress(q)
# stop workers
for i in range(num_processes):
q.put(None)
for t in threads:
t.join()
Где report_progress
определяется следующим образом
def report_progress(q):
qsize_init = q.qsize()
while not q.empty():
time.sleep(5)
portion_finished = 1 - q.qsize() / qsize_init
print("run_parallel: {:.1%} jobs are finished".format(portion_finished))
Однако я хочу сообщать о прогрессе каждый час, а не 5 секунд, и если все задания будут завершены, программа может просто простаивать в течение многих минут.
Другая возможность состоит в том, чтобы определить report_progress
по-другому:
def report_progress(q):
qsize_init = q.qsize()
time_start = time.time()
while not q.empty():
current_time = time.time()
if current_time - time_start > 5:
portion_finished = 1 - q.qsize() / qsize_init
print("run_parallel: {:.1%} jobs are finished".format(portion_finished))
time_start = time.time()
Я беспокоюсь, что постоянная проверка этого условия будет истощать ресурсы ЦП, небольшая часть, но в масштабе часов это может быть много.
Есть ли стандартный способ справиться с этим?
Питон: 3.6
threading
, и я хотел добавить к нему небольшое дополнение. Если я используюasyncio
, мне придется все это переписать, это правильно? Идея из вашего второго комментария выглядит как хороший компромисс - person icemtel   schedule 28.11.2018