Python3.x分线程异步请求

重写线程(threading)

import threading
import time

class WMThread(threading.Thread):
    def __init__(self, download_url,time):
        super(WMThread, self).__init__()
        self.download_url = download_url
        self.time = time

    def run(self):
        print("run",self.download_url)
        time.sleep(self.time)
        print("end",self.download_url)
        pass
    pass

t = WMThread("http://www.baidu.com",5)
t.start()
print(t.ident,t.is_alive())

实例1:分线程异步请求数据

import threading, requests,json,queue


class WMRequestThread(threading.Thread):
    def __init__(self, request_type, download_url, datajson,callback):
        """
        初始化
        :param request_type: get or post
        :param download_url: request url
        :param datajson: input json data
        :param callback: callback respon text
        """
        super(WMRequestThread, self).__init__()

        self.request_type = request_type.lower()
        self.download_url = download_url
        self.datajson = datajson
        self.callback = callback

    def run(self):
        print("run",self.download_url)
        data_respon = ""
        if self.request_type == "get":
            data_respon = self.request_get(self.download_url,self.datajson)
        elif self.request_type == "post":
            data_respon = self.request_post(self.download_url, self.datajson)
        self.callback(data_respon)
        pass

    def request_get(self,url, data_json):
        """
        get request
        :param url: request url
        :param data_json: inout params eg:data_json = {'mobile':username , 'site': siteid}
        :return: respon text
        """
        try:
            print(url, data_json)
            respon = requests.get(url, params=data_json)
            print("respon==",respon.text)
            data_respon = respon.text
        except:
            data_respon = ""
            # print("error")
        finally:
            print(data_respon)
        return data_respon

    def request_post(self, url, data_json):
        """
        post request
        :param url: request url
        :param data_json: input params eg: data_json = {'mobile':username , 'site': siteid}
        :return: respon text
        """
        try:
            print(url, data_json)
            respon = requests.post(url, data=data_json)
            print(respon)
            try:
                data_respon = respon.text
                pass
            except:
                data_respon = ""
                pass
            finally:
                print(data_respon)
        except:
            pass
        finally:
            print(data_respon)
        return data_respon
    pass

if __name__ == '__main__':
    def get_respon_value(value):
        print("value==",value)
    data_json = {'mobile':"xiaoming" , 'site': "11"}
    t = WMRequestThread("get","http://www.weather.com.cn/data/sk/101190408.html",data_json,get_respon_value)
    t.start()

使用 multiprocessing的Pool实现

from multiprocessing import Process, Pool
import multiprocessing
import requests


def request_get(url, data_json):
    """
    get request
    :param url: request url
    :param data_json: inout params eg:data_json = {'mobile':username , 'site': siteid}
    :return: respon text
    """
    try:
        print(url, data_json)
        respon = requests.get(url, params=data_json)
        print("respon==", respon.text)
        data_respon = respon.text
    except:
        data_respon = ""
        # print("error")
    finally:
        print(data_respon)
    return data_respon

def respon_callback(value):
    print(value)

if __name__ == '__main__':
    multiprocessing.freeze_support()
    url = "http://www.weather.com.cn/data/sk/101190408.html"
    data_json = {'mobile':"xiaoming", 'site': "11"}
    print("start====>")
    p = Pool(1)
    p.apply_async(func=request_get,args=(url,data_json,),callback=respon_callback)
    p.close()
    p.join()
    print("end===>")

Pool 必须在 if __name__ == '__main__': "调用

Python3.5 可以使用 aiohttp 和 asyncio实现

import aiohttp
import asyncio

"""
    aiohttp:发送http请求
    1.创建一个ClientSession对象
    2.通过ClientSession对象去发送请求(get, post, delete等)
    3.await 异步等待返回结果
"""

async def main():
    url = 'http://httpbin.org/get'
    async with aiohttp.ClientSession() as session:
        async with session.get(url) as res:
            print(res.status)
            print(await res.text())
loop = asyncio.get_event_loop()
task = loop.create_task(main())
loop.run_until_complete(task)

安装 aiohttp pip 安装 pip install aiohttp
aiohttp官方文档https://aiohttp.readthedocs.io/en/stable/client_quickstart.html

发布了121 篇原创文章 · 获赞 54 · 访问量 44万+

猜你喜欢

转载自blog.csdn.net/wm9028/article/details/103890083