[英]Python: threads can only be started once
我想在python中进行线程处理。 我有 100 个单词,想把它们放在 6 个不同的链接中。 如果其中一个链接已准备好,我希望该链接可以获取新词。 这同时其他线程仍然在工作中的第一个单词。 完成100个关键字后,我的完整程序应该可以先做更多的代码。 我有以下代码:
threads = []
def getresults(seed):
for link in links:
t = threading.Thread(target=getLinkResult, args = (suggestengine, seed))
threads.append(t)
for thread in threads:
thread.start()
for seed in tqdm:
getresults(seed + a)
getresults(seed + b)
for thread in threads:
thread.join()
#code that should happen after
我现在收到一个错误:线程只能启动一次
您调用getresults
两次,并且两次,它们都引用相同的全局threads
列表。 这意味着,当您第一次调用getresults
时,线程会启动。
当您第二次调用它们时,之前已经运行的线程会再次调用.start()
方法。
您应该将getresults
中的线程作为本地线程启动,然后将它们附加到全局threads
列表中。
虽然您可以执行以下操作:
for thread in threads:
if not thread.is_alive():
thread.start()
它不能解决问题,因为一个或多个线程可能已经结束并因此重新启动,因此会导致相同的错误。
您应该只在 getresults 中启动新线程
threads = []
def getresults(seed):
local_threads = []
for link in links:
t = threading.Thread(target=getLinkResult, args = (suggestengine, seed))
local_threads.append(t)
threads.append(t)
for thread in local_threads:
thread.start()
for seed in tqdm:
getresults(seed + a)
getresults(seed + b)
for thread in threads:
thread.join()
错误是明确的。 你开始你的线程两次,而你不应该。
getresults(seed + a)
getresults(seed + b)
当您对这些调用进行排序时,您将启动两次线程循环。 为了正确地做你想做的事,你需要创建一个线程池和一个任务队列。 基本上,您需要第二个要处理的单词列表和一个互斥锁。 每个线程将锁定互斥锁,读取并出列一个字,然后解锁并处理该字。
最快的方式,但不是最聪明的(一般问题):
from tkinter import *
import threading, time
def execute_script():
def sub_execute():
print("Wait 5 seconds")
time.sleep(5)
print("5 seconds passed by")
threading.Thread(target=sub_execute).start()
button_1 = Button(master=root, text="Execute Script", command=execute_script)
button_1.pack()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.