代码:
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
我有这段代码设置。scrape函数使用页面i抓取网站,并返回优惠链接列表。此函数还打印列表的长度,仅用于调试目的。当我运行我的代码时,它在前几页运行得很好,打印total:len(offers),但之后它就不运行"total:"打印,只使用scrape函数中的打印。这就是输出。预期输出将类似
total: 120
120
total: 240
120
total: 360
等等。
我很乐意接受任何帮助,这是我第一次在python中处理并发内容,也是第一次使用堆栈溢出来提问。
也许这将帮助您理解线程。
每个线程都会占用自己的处理时间,一旦完成就会返回。因此,您将不会看到像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)
的结果。
在这种类型的设置中,我们等待它们完成(就像您所做的那样),然后根据预期安排结果。