使用協程實現多個網址同時請求,並異步處理接收到的數據


實現目的:

對百度同時發起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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM