Python:线程只能在

2024-04-26 05:58:31 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我现在有个错误: 线程只能启动一次


Tags: 代码in程序for链接deflink关键字
3条回答

您将调用getresults两次,两次都引用同一个全局threads列表。这意味着,当您第一次调用getresults时,线程将启动。

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

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

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

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

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

错误是明确的。你开始你的线程两次,而你不应该

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

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

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

相关问题 更多 >