python 请求和 concurrent.futures 问题

Issue with python requests and concurrent.futures

代码:

with concurrent.futures.ThreadPoolExecutor(max_workers=6) as executor:
    for i in range(r):
        processes.append(executor.submit(scrape, i))
    for _ in concurrent.futures.as_completed(processes):
        offers += _.result()
        print('total:', len(offers))

抓取功能看起来像这样:

def scrape(i):
    requests.get(f'somepage.com/page{i}')
    //use bs4 to get the offers
    print(len(offers))
    return offers

我有这段代码设置。抓取功能抓取第 i 页和 returns 优惠链接列表的网站。此函数还打印列表的长度,仅用于调试目的。 当我 运行 我的代码时,前几页运行良好,打印总计:len(offers),但之后它不会 运行 'total:' 打印,只会继续在刮擦功能中打印。 This is the output。预期的输出类似于

total: 120
120
total: 240
120
total: 360

等等

我很乐意接受任何帮助,这是我第一次在 python 中处理并发问题,也是第一次使用堆栈溢出来提问。

也许这会帮助您理解线程。

每个线程都有自己的处理时间,一旦完成就会 return。所以你不会看到像 print(len(offers)) 然后 print('total:', len(offers)).
这样的顺序的结果 只是为了测试这一点,假设我们删除请求并进行如下调整:

import concurrent.futures
r=10
processes=[]
offers=""
with concurrent.futures.ThreadPoolExecutor(max_workers=6) as executor:
    for i in range(r):
        processes.append(executor.submit(scrape, i))
    for _ in concurrent.futures.as_completed(processes):
        offers += _.result()
        #print('total:', len(offers))
        print('total:', offers)
        print("*****")

def scrape(i):
    print(f"scrape {i}")
    return f"scrape return {i}"

您会注意到 print(f"scrape {i}") 在处理的早期就已经处理,然后得到 print('total:', offers) 的结果。

在这种类型的设置中,我们等待它们完成(就像您所做的那样),然后按照预期排列结果。