繁体   English   中英

Python:线程只能启动一次

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM