實現目的:
對百度同時發起100個請求,並異步處理請求的結果
關鍵技術:
使用隊列存儲請求的結果
代碼如下
# author: luojun
# date: 2020/1/6 16:43
from gevent import monkey
import gevent
import requests
from queue import Queue
import time
import logging
logging.basicConfig(level=logging.INFO)
monkey.patch_all()
q_res = Queue(maxsize=1000)
for i in range(100):
q_res.put(i, timeout=1)
i = 0
def download(url):
'''
網絡請求部分
:param url:
:return:
'''
print('start request:{}'.format(url))
res = requests.get(url=url)
q_res.put(res.content)
print(len(res.content), url)
def get_content_queue():
'''
數據處理部分
:return:
'''
while 1:
# if q_res.empty():
# break
try:
queue_get = q_res.get(timeout=10)
logging.info(queue_get)
except Exception as e:
break
def add(num):
global i
i += num
time.sleep(1)
def main():
global i
url_baidu = 'http://www.baidu.com/'
list_url = [gevent.spawn(download, url_baidu) for i in range(100)]
# list_coroutine = [gevent.spawn(add, 1) for i in range(10000)]
content_deal = gevent.spawn(get_content_queue)
gevent.joinall(list_url)
content_deal.join()
# print(q_res.qsize())
# gevent.joinall(list_coroutine)
# print(i)
def main2():
'''
對於不斷新增的請求可以使用隊列的方式,制作異步請求,然后放到隊列中,
獲取到一個新的要請求的地址,制作異步請求,放到隊列中
使用循環從隊列中取出,然后join
情況2:已經確定的url地址,放在一個列表中,需要全部請求,不會再次增加,那還是直接做一個異步列表,然后使用joinall 方便,
對於請求的結果,還是需要使用隊列來存儲,同時需要創建另一個進程來消耗該隊列中的數據,不是很確定能不能實現.
3,單次請求量如果太大的話還是要考慮使用IP代理,防止被封ip.
:return:
'''
# 現在假設有這么多的地址需要請求,使用協程來實現
# 對於那種url一直累加的請求,可以使用隊列的方式實現.
pass
#
if __name__ == '__main__':
main()
pass