同步异步与回调函数

同步异步

1,同步

  • 同步是指一个进程在执行某个请求的时候,若该请求需要一段时间才能返回信息,那个这个进程会一直等待下去,直到收到返回信息,才继续执行下去

    from concurrent.futures import ProcessPoolExecutor, ThreadPoolExecutor
    import os, random
    
    def task(i):
        print(f'{os.getpid()}开始了任务')
        time.sleep(random.randint(1,3))
        print(f'{os.getpid()}结束了任务')
        return i
    
    if __name__ == '__main__':
        p = ProcessPoolExecutor()
        for i in range(10):
            obj = p.submit(task, i)
            print(obj.result())
        p.shutdown(wait=True)

2,异步

  • 是指进程不需要一直等待下去,而是继续执行下面的操作,不管其他进程 的状态,当有消息返回时系统会通知进程进行处理,这样可以提高执行的效率
  • from concurrent.futures import ProcessPoolExecutor, ThreadPoolExecutor
    import os
    import requests
    
    def task(i):
        print(f'{os.getpid()}开始了任务')
        time.sleep(random.randint(1,3))
        print(f'{os.getpid()}结束了任务')
        return i
    
    if __name__ == '__main__':
        p = ThreadPoolExecutor()
        li = []
        for i in range(10):
            obj = p.submit(task, i)
            li.append(obj)
        p.shutdown()
        for i in li:
            print(i.result())
    ##################map函数的应用
    if __name__ == '__main__':
        p = ProcessPoolExecutor()
        obj = p.map(task, range(10))
        p.shutdown()
        print(list(obj))

回调函数

  • 进程池与线程池的区别

    • 进程池:主进程调用回调函数,得到任务结果
    • 线程池:空闲线程调用回调函数,得到任务结果
  • 回调函数什么时候用,回调函数在爬虫中最常用,造数据的非常耗时,处理数据的时候不耗时
  • 回调函数的场景:进程池中任何一个任务一旦完成了,就立即告知主进程,主进程则调用一个函数去处理结果,该函数即回调函数。
  • 我们可以把耗时间即阻塞的任务放到进程池中,然后指定回调函数(主进程负责执行),这样主进程就在执行回调函数时就省去了IO阻塞的过程,直接拿到任务单结果
  • 异步加回调函数处理网站
  • from concurrent.futures import ProcessPoolExecutor, ThreadPoolExecutor
    import os
    import requests
    
    def url_page(url):
        response = requests.get(url)
        print(f'{os.getpid()} is getting {url}')
        if response.status_code == 200:
            return {"url": url, "text": response.text}
    
    def parse_page(res):
        res = res.result()
        with open('url.text', 'a', encoding='utf-8') as f:
            parse_res = f"url:{res['url']} size:{len(res['text'])}"
            f.write(parse_res+'\n')
    
    if __name__ == '__main__':
        p = ProcessPoolExecutor(4)
        # p = ThreadPoolExecutor(4)
        l = [
            'http://www.baidu.com',
            'http://www.baidu.com',
            'http://www.baidu.com',
            'http://www.baidu.com',
            'http://www.JD.com',
            'http://www.JD.com',
            'http://www.JD.com',
            'http://www.JD.com',
            'http://www.JD.com',
            'http://www.JD.com',
        ]
        for i in l:
            # res = p.submit(url_page, i).add_done_callback(parse_page)
            ret = p.submit(url_page, i)
            ret.add_done_callback(parse_page)
        p.shutdown()
    

原文地址:https://www.cnblogs.com/daviddd/p/12034432.html

时间: 2024-10-07 19:13:05

同步异步与回调函数的相关文章

【Javascript】Js同步异步以及回调函数

一.前言 今天查看了requireJs方面的知识,看着看着就看到了JS中同步与异步操作的知识点,经过查阅了很多的资料,基本了解了JS的同步与异步的操作,其中涉及到的知识点如下: 什么时同步和异步? JS的是基于事件驱动的单线程语言,为啥会有异步操作这种多线程的操作??? 浏览器线程,浏览器内核线程间的合作? JS的异步操作都有哪些?它是如何工作的? 二.js单线程 JS的单线程 单线程的含义是js只能在一个线程上运行,也就是说,同一时间只能做一件事情,其他的任务则会放在任务队列里面排队等等js线

python_高级进阶(4)同步_异步_回调函数_阻塞

阻塞 阻塞: 程序运行时,遇到了IO,程序挂起,cpu被切走. 非阻塞 非阻塞: 程序没有遇到IO,程序遇到IO但是我通过某种手段,让cpu强行运行我的程序. ? #同步: 提交一个任务,自任务开始运行直到此任务结束(可能有IO),返回一个返回值之后,我在提交下一个#? #异步: 一次提交多个任务,然后我就直接执行下一行代码. 收取结果 : 1将所有的任务的结果统一回收. 2. 完成一个任务,返回一个结果. 给三个人发布任务: 同步: 先告知第一个人完成写书的任务,我从原地等待,等他两天之后完成

javaScript中的同步,异步与回调函数

for (var i = 0; i < 5; i++) { setTimeout(function() { console.log('i: ',i); }, 1000); } console.log(i); 输出结果: //输出 5 i: 5 i: 5 i: 5 i: 5 i: 5 记住我们的口诀,同步=>异步=>回调 1.for循环和循环体外部的console是同步的,所以先执行for循环,再执行外部的console.log.(同步优先) 2.for循环里面有一个setTimeout回

同步和异步以及回调函数

一.同步 <script type="text/javascript"> for(var i=0; i<100; i++){ //先执行循环* ,在输出222 console.log('*') } console.log(222); </script> 二.异步 <script type="text/javascript"> setInterval(function(){ //先输出111,再输出定时* console.lo

同步、异步、回调函数面试经典问题

1.首先需要记住的是这么一句话 同步先行==>异步靠边=>回调垫底 <script> var a = new Promise(function () { console.log(1); setTimeout(() => consoel.log(2), 0); console.log(3); console.log(4); resolve(true); }) a.then(v => { console.log(8) }); var b = new Promise(func

同步异步;回调、轮询;序列化

IO编程中,Stream(流)是一个很重要的概念,可以把流想象成一个水管,数据就是水管里的水,但是只能单向流动.Input Stream就是数据从外面(磁盘.网络)流进内存,Output Stream就是数据从内存流到外面去.对于浏览网页来说,浏览器和新浪服务器之间至少需要建立两根水管,才可以既能发数据,又能收数据. 由于CPU和内存的速度远远高于外设的速度,所以,在IO编程中,就存在速度严重不匹配的问题.举个例子来说,比如要把100M的数据写入磁盘,CPU输出100M的数据只需要0.01秒,可

同步异步 + 回调函数

重点记忆 异步回调函数 如果进程池+回调: 回调函数由主进程去执行. 如果线程池+回调: 回到函数由空闲的线程去执行.(比如有4个线程,10个任务,第一轮完成4个任务,交由主线程处理结果,第二轮同样如此,但是第三轮将会空闲出2个子进程,则这2个子进程将会和主进程一同处理结果,以此类推,当所有的任务完成时,所有的子进程和主进程一起处理结果,增加效率) 回调函数不管有没有返回数据,返回值都是None,回调函数内部加函数名是调用此函数,obj隐形传参 1.概念 1. 从执行的角度 阻塞: 程序运行时,

协程,事件,队列,同步,异步,回调函数

协程 什么是协成?单个线程并发的处理多个任务,程序控制协成的切换+保持状态,协成的切换速度非常快,蒙蔽了操作系统的眼睛,让操作系统认为CPU一直在运行 进程或线程都是由操作系统控制CPU来回切换,遇到阻塞就切换执行其他任务,协成是程序控制的,霸占CPU执行任务,会在操作系统控制CPU之前来回切换,操作系统就认为CPU一直在运作 协程的优点: 1.开销小 2.运行速度快 3.协程会长期霸占CPU只执行我程序里的所有任务 协程的缺点: 1.协程属于微并发,处理任务不易过多 2.协程的本质是单线程,无

ArcGIS API for JavaScript 4.2学习笔记[7] 鹰眼(缩略图的实现及异步处理、Promise、回调函数、监听的笔记)

文前说明:关于style就是页面的css暂时不做评论,因为官方给的例子的样式实在太简单了,照抄阅读即可. 这篇文章有着大量AJS 4.x版本添加的内容,如监听watch.Promise对象.回调函数.异步处理等内容,原理性的东西我会在文末解释,各位看官不用担心看不懂,我尽量用通俗的语言解释这些. 惯例,如果不习惯从头看到尾,可以直接跳到后面看总结. 大家应该看过商业地图的缩略图功能吧?以度娘地图为例,在使用街景地图的时候,左下角会出现一个地点一样的2D小地图: 这个就是鹰眼功能的应用,在很多桌面