Python:线程只能启动一次

时间:2016-04-29 11:51:12

标签: python multithreading

我想在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

我现在收到错误:     线程只能启动一次

4 个答案:

答案 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()