【问题标题】:Python concurrent.futures: threads don't startPython concurrent.futures:线程不启动
【发布时间】:2021-04-05 12:24:14
【问题描述】:

我编写了一个程序,它使用 concurrent.futures 启动 4 个线程并向列表中的每个网站发送请求。

问题:它只是没有启动

import requests
import threading
import concurrent.futures

list=['amazon.com', 'google.com', 'youtube.com', 'microsoft.com']

def start(url):
    requests.get('https://'+url)
    print(line+' finished')

with concurrent.futures.ThreadPoolExecutor(max_workers=4) as executor:
    for url in list:
        executor.submit(start, url)

另一方面,这有效:

import concurrent.futures

def start():
    print('lol')

with concurrent.futures.ThreadPoolExecutor(max_workers=4) as executor:
    for i in range(10):
        executor.submit(start)

【问题讨论】:

  • print(line+'finished') - 我错了还是这里没有定义可变行?
  • 是的,这是真的,谢谢。现在它正在为此代码工作,但它没有显示任何错误消息。我该如何改变呢?
  • 如果您的代码正常运行,它不会显示任何错误,如果您想在每次请求后添加消息,您应该编写如下内容: print('{} finished'.format(url))

标签: python multithreading concurrent.futures


【解决方案1】:

您刚刚安排了任务,但您没有等待结果,并且您的代码中有错误(使用未定义的变量)但是错误消息被上下文管理器“吞下”。

executor.submit方法返回一个Future对象,可以通过调用result方法获取返回值:

import requests
import threading
import concurrent.futures

URLS = ['amazon.com', 'google.com', 'youtube.com', 'microsoft.com']


def start(url):
    requests.get('https://' + url)
    print(f'{url}: finished')


def main():
    futures = []

    with concurrent.futures.ThreadPoolExecutor(max_workers=4) as executor:
        for url in URLS:
            futures.append(executor.submit(start, url))

        for future in futures:
            future.result()


if __name__ == "__main__":
    main()

【讨论】:

    猜你喜欢
    • 2022-01-10
    • 1970-01-01
    • 2020-03-02
    • 2015-02-03
    • 2023-01-24
    • 1970-01-01
    • 2021-01-13
    • 2016-01-23
    • 1970-01-01
    相关资源
    最近更新 更多