我想在for循环中轮流启动线程,但是下一个线程不应该在当前的线程完成之前启动。请帮我解决这个问题。
我想实现这一目标,因为我有一个GUI,每个循环都会出现一个进度条并运行,GUI不会被锁定(它不会给那个丑陋的"没有回应& #34;错误)
for op in ["op1", "op2"]:
start_thread()
def start_thread():
display_and_run_progress_bar()
do_the_operation()
when_op_is_completed_destroy_progress_bar()
答案 0 :(得分:2)
要在自己的线程中运行每个op,但一次只运行一个,在启动每个线程后,您必须join
。 join
告诉主进程等待线程完成后再继续。使用您的伪代码样式:
for op in ["op1", "op2"]:
thread = start_thread(op)
thread.join()
根据您使用的线程库,它会有所不同,但请参阅https://docs.python.org/2/library/threading.html#threading.Thread.join。
如果你在主线程上运行上面的代码,那仍然会锁定GUI。我建议的不是为每个操作创建一个新线程,而是创建一个逐个执行每个操作的单个线程,如下所示:
thread = threading.Thread(target=do_ops, args=[["op1", "op2"]])
thread.start()
def do_ops(ops):
for op in ops:
display_and_run_progress_bar()
do_the_operation()
when_op_is_completed_destroy_progress_bar()
现在所有的操作都在一个主进程之外的单个线程中运行,因此它不会锁定GUI。