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)
的结果。
在这种类型的设置中,我们等待它们完成(就像您所做的那样),然后按照预期排列结果。
代码:
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)
的结果。
在这种类型的设置中,我们等待它们完成(就像您所做的那样),然后按照预期排列结果。