Python:线程只能启动一次

Python:线程只能启动一次,python,multithreading,Python,Multithreading,我想用python做线程。我有100个字,想把他们在6个不同的链接。如果其中一个链接已准备好,我希望该链接可以得到新单词。这是在其他线程仍在工作的第一个字时进行的。当完成100个关键字时,我的完整程序应该被允许首先执行更多代码。我有以下代码: threads = [] def getresults(seed): for link in links: t = threading.Thread(target=getLinkResult, args = (suggesteng

我想用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
两次,两次都引用相同的全局
线程
列表。这意味着,当您第一次调用
getresults
时,线程将启动

当您第二次调用它们时,前面已经运行的线程将再次调用
.start()
方法

您应该将
getresults
中的线程作为本地线程启动,然后将它们附加到全局
threads
列表中

尽管您可以执行以下操作:

for thread in threads:
    if not thread.is_alive():
        thread.start()

它不能解决问题,因为一个或多个线程可能已经结束,因此会再次启动,因此会导致相同的错误。

错误是明确的。你可以启动两次线程,但不应该

getresults(seed + a)
getresults(seed + b)

当您对这些调用进行排序时,将启动两次线程循环。要正确地做你想做的事,你必须做一个决定。基本上,您需要第二个要处理的单词列表和互斥锁。每个线程将锁定互斥锁,读取一个单词并将其出列,然后解锁并处理该单词。

您应该在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()

最快的方法,但不是最聪明的(一般问题):


请张贴您的error@Kasramvd使用这段代码,我会遇到错误“线程只能启动一次”如何更改代码以使一切正常运行?@GilbertAllen RuntimeError:threads只能启动一次如果我更改代码以使thread.join for every thread在获得相同结果后才启动error@Sonius试试我的建议,看看它是否有效。也许应该。我正在再试一次。但是现在我得到了消息:“list”对象没有属性“is_alive”@Sonius应该是
thread.is_alive
不是
threads
。我的错误已经纠正了。这是我第一次犯的错误。但我只能在5个线程中完成1个单词。如果所有5个线程都准备好了,我可以做下一个单词。但是在游戏Branic的解决方案中,第三个单词可能在线程1中,而线程2仍然在单词1上工作:)虽然你的答案很好,但它不符合用户的目的。用户希望成批调用线程,即需要重新启动相同的线程。
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()