我想在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
我现在收到错误: 线程只能启动一次
答案 0 :(得分:7)
您正在调用getresults
两次,并且两次都引用相同的全局threads
列表。这意味着,当您第一次调用getresults
时,会启动线程。
当您第二次调用它们时,之前运行的线程会再次调用.start()
方法。
您应该将getresults
中的线程作为本地线程启动,然后将它们附加到全局threads
列表中。
虽然您可以执行以下操作:
for thread in threads:
if not thread.is_alive():
thread.start()
它没有解决问题,因为一个或多个线程可能已经结束并因此再次启动,因此会导致相同的错误。
答案 1 :(得分:2)
你应该只在你的结果中开始新的线程
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()
答案 2 :(得分:0)
错误是明确的。你开始你的线程两次,而你不应该。
getresults(seed + a)
getresults(seed + b)
当您对这些调用进行排序时,您将开始两次线程循环。为了正确地做你想做的事,你要做一个thread pool and a task queue。基本上,您需要第二个要处理的单词列表和一个互斥锁。每个线程将锁定互斥锁,读取和出列一个单词,然后解锁并处理该单词。
答案 3 :(得分:0)
最快的方法,但不是最明亮的(一般问题):
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()