• 并发编程:异步+回调机制


    一:进程

    1、导入模块

       2.定义访问下载函数

       3.解析下载的内容

      4.在进程池里放任务,并把任务提交给get函数

     完整代码:

     1 from concurrent.futures import ProcessPoolExecutor,ThreadPoolExecutor
     2 import requests
     3 import os
     4 import time
     5 import random
     6 
     7 def get(url):
     8     print('%s GET %s' %(os.getpid(),url))   
     9     response=requests.get(url)               
    10     if response.status_code == 200:          
    11         return response.text                
    12 
    13 def pasrse(obj):     
    14     res=obj.result()  
    15     print('%s 解析结果为:%s' %(os.getpid(),len(res)))
    16 
    17 if __name__ == '__main__':
    18     urls=[
    19         'https://www.baidu.com',
    20         'https://www.baidu.com',
    21         'https://www.baidu.com',
    22         'https://www.baidu.com',
    23         'https://www.baidu.com',
    24         'https://www.baidu.com',
    25         'https://www.baidu.com',
    26         'https://www.baidu.com',
    27         'https://www.python.org',
    28     ]
    29 
    30     pool=ProcessPoolExecutor(4)     
    31     for url in urls:                
    32         obj=pool.submit(get,url)
    33         obj.add_done_callback(pasrse)  
    34     print('主进程',os.getpid())
    View Code
    运行结果:

    主进程 5588
    6976 GET https://www.baidu.com
    17844 GET https://www.baidu.com
    16832 GET https://www.baidu.com
    8956 GET https://www.baidu.com
    17844 GET https://www.baidu.com
    5588 解析结果为:2443
    8956 GET https://www.baidu.com
    5588 解析结果为:2443
    16832 GET https://www.baidu.com
    5588 解析结果为:2443
    6976 GET https://www.baidu.com
    5588 解析结果为:2443
    17844 GET https://www.python.org
    5588 解析结果为:2443
    5588 解析结果为:2443
    5588 解析结果为:2443
    5588 解析结果为:2443
    5588 解析结果为:48887

    Process finished with exit code 0

    二:线程

    过程与进程相似,但线程没有主次之分,哪个线程闲着了就由哪个线程干回调的活

    from concurrent.futures import ProcessPoolExecutor,ThreadPoolExecutor
    from threading import current_thread
    import requests
    import os
    import time
    import random
    
    def get(url):
        print('%s GET %s' %(current_thread().name,url))
        response=requests.get(url)
        time.sleep(random.randint(1,3))
    
        if response.status_code == 200:
            return response.text
    
    def pasrse(obj):
        res=obj.result()
        print('%s 解析结果为:%s' %(current_thread().name,len(res)))
    
    if __name__ == '__main__':
        urls=[
            'https://www.baidu.com',
            'https://www.baidu.com',
            'https://www.baidu.com',
            'https://www.baidu.com',
            'https://www.baidu.com',
            'https://www.baidu.com',
            'https://www.baidu.com',
            'https://www.baidu.com',
            'https://www.python.org',
        ]
    
        pool=ThreadPoolExecutor(4)
        for url in urls:
            obj=pool.submit(get,url)
            obj.add_done_callback(pasrse)
    View Code

    运行结果:

    ThreadPoolExecutor-0_0 GET https://www.baidu.com
    ThreadPoolExecutor-0_1 GET https://www.baidu.com
    ThreadPoolExecutor-0_2 GET https://www.baidu.com
    ThreadPoolExecutor-0_3 GET https://www.baidu.com
    ThreadPoolExecutor-0_0 解析结果为:2443
    ThreadPoolExecutor-0_0 GET https://www.baidu.com
    ThreadPoolExecutor-0_2 解析结果为:2443
    ThreadPoolExecutor-0_2 GET https://www.baidu.com
    ThreadPoolExecutor-0_1 解析结果为:2443
    ThreadPoolExecutor-0_1 GET https://www.baidu.com
    ThreadPoolExecutor-0_0 解析结果为:2443
    ThreadPoolExecutor-0_0 GET https://www.baidu.com
    ThreadPoolExecutor-0_3 解析结果为:2443
    ThreadPoolExecutor-0_3 GET https://www.python.org
    ThreadPoolExecutor-0_2 解析结果为:2443
    ThreadPoolExecutor-0_0 解析结果为:2443
    ThreadPoolExecutor-0_1 解析结果为:2443
    ThreadPoolExecutor-0_3 解析结果为:48887

    Process finished with exit code 0

  • 相关阅读:
    MySQL基础之第9章 触发器
    Windows系统安装————windows7 企业版 无法安装 NET.framework4.52-4.6版本在WIN7下解决办法
    流媒体技术学习笔记之(十二)Linux(Ubuntu)环境运行EasyDarwin
    流媒体服务器之————EasyDarwin开源流媒体服务器:编译、配置、部署
    流媒体技术学习笔记之(十一)Windows环境运行EasyDarwin
    流媒体技术学习笔记之(十)HLS协议直播延时优化(35s到10S)
    流媒体技术学习笔记之(九)减少VLC 延迟的方法
    流媒体技术学习笔记之(八)海康、大华IpCamera RTSP地址和格式
    流媒体技术学习笔记之(七)进阶教程OBS参数与清晰度流畅度的关系
    Phalcon框架之———— 2.0升级到3.0 问题Model验证问题解决
  • 原文地址:https://www.cnblogs.com/zh-xiaoyuan/p/11773867.html
Copyright © 2020-2023  润新知