美文网首页
Python3.x 分线程异步请求

Python3.x 分线程异步请求

作者: WMSmile | 来源:发表于2020-01-08 14:01 被阅读0次

重写线程(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

相关文章

  • Python3.x 分线程异步请求

    重写线程(threading) 实例1:分线程异步请求数据 使用 multiprocessing的Pool实现 P...

  • 基于Spring框架实现异步请求与异步调用

    一、异步请求 1.1 同步请求与异步请求 首先看一下同步请求的线程执行模型: 接着看一下异步请求的线程执行模型: ...

  • javasrcipt的同步异步请求

    例如 像下面代码就是异步请求 异步请求 把第一段代码看成主线程,当主线程运行到第二段代码时就是异步请求了,主线程就...

  • 异步

    异步 异步请求 同步请求:同一个请求由一个线程从头到尾进行处理 一步到位 异步请求:同一个请求中由多个线程进行处理...

  • 4.1、异步servlet

    同步:接收到一个请求后,tomcat 容器提供一个线程,线程调用servlet。异步:请求异步处理后tomcat ...

  • 在使用NSURLConnection 时异步请求的坑 以及NSR

    在使用NSURLConnection 时异步请求的坑当我们使用子线程创建NSURLConnection异步请求时发...

  • SpringBoot中异步请求和异步调用(看这一篇就够了)

    一、SpringBoot中异步请求的使用 1、异步请求与同步请求 特点: 可以先释放容器分配给请求的线程与相关资源...

  • Spring Boot 异步请求和异步调用

    一、Spring Boot中异步请求的使用 1、异步请求与同步请求 特点: 可以先释放容器分配给请求的线程与相关资...

  • iOS-多线程中的信号量

    网络请求的任务是提交给子线程异步处理了,对于主线程网络请求这样的任务也就快速执行完毕了,但是对于主线程网络请求是一...

  • gcd

    GCD 异步请求,我只认准 GCD | GCD异步,你值得拥有 (广告先走一波) 网络请求放在子线程,UI 只能在...

网友评论

      本文标题:Python3.x 分线程异步请求

      本文链接:https://www.haomeiwen.com/subject/vgqsactx.html