首页 > 其他 > 详细

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

时间:2019-10-31 22:31:25      阅读:63      评论:0      收藏:0      [点我收藏+]

一:进程

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

 

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

原文:https://www.cnblogs.com/zh-xiaoyuan/p/11773867.html

踩
(0)
赞
(0)
   
举报
评论 一句话评论(0)
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!