回调函数 协程

# 什么是回调函数:# a交给b一个任务 b在执行完成后回过头调用了a的一个函数 就称之为回调# 为什么需要回调函数:#    需要获取异步任务的结果,但是又不应该阻塞(降低效率)#    高效率的获取任务结果# 通常异步任务都会和回调函数一起使用# 通过给future对象绑定一个函数 add_done_callback()### obj.add_done_callback(参数函数名)# 注意:在多进程中回调函数是交给住进程来执行而在多线程中 回调函数是谁有空谁执行(不是主线程)

队列:
# 队列:# from queue import   Queue,LifoQueue,PriorityQueue## # Queue 队列 先进先出# # LifoQueue 堆栈  后进先出# # PriorityQueue 优先级队列 取出顺序是 小的优先级先取出来# # 优先级可以使用数据或者字符# pq =PriorityQueue()# pq.put((1,‘a‘))# pq.put((2,‘b‘))# print(pq.get())
 事件: 就是一个通知# 是用于协调多个线程工作的,当一个线程要执行某个操作,需要获取另外一个线程的状态

# from threading import Event,Thread# import time# e = Event()  #默认False# def start():#     print(‘正在启动服务器‘)#     time.sleep(5)#     print(‘服务器启动成功‘)#     e.set() # 把时间的值设置为Ture# def connect():#     print(‘等待服务器启动...‘)#     e.wait()  #会阻塞 直到对方把事件设置为Ture#     if e.isSet():#         print(‘连接成功!‘)# Thread(target=start).start()# Thread(target=connect).start()### def connect():#     #客户端尝试3次连接服务器 3次不成功后放弃每次等待1s#     for i in range(3):#         print(‘等待服务器启动...‘)#         e.wait(1)  #会阻塞 直到对方把事件设置为Ture#         if e.isSet():#             print(‘连接成功!‘)#             break#         else:#             print(‘连接失败‘)#     else:#         print(‘服务器没有启动‘)


    greenlet 主要封装了生成器 是的我们在使用生成器实现并发时 简化了代码

"""

import greenlet
import time

def task1():
    print("task1 run")
    time.sleep(10)
    g2.switch()
    print("task1 run")

def task2():
    print("task2 run")
    g1.switch()

g1 = greenlet.greenlet(task1)
g2 = greenlet.greenlet(task2)
g1.switch()
协程:可以这么理解是协助线程更高效的工作本质就是单线程现实并发也称之为微线程(它比线程更轻量级 单线程下任务的切换比操作系统切换线程要简单 的多)
from gevent import monkeymonkey.patch_all()import geventimport time

def task3():    print(‘task3 run‘)    time.sleep(3)    print(‘task3 run‘)

def task4():    print(‘task4 run‘)    time.sleep(3)    print(‘task3 run‘)g1 = gevent.spawn(task3)g2 = gevent.spawn(task4)
异步提交任务 不考虑是否执行完,直接运行下去直接结束

# gevent.joinall([g1,g2])  #等待所有任务结束# 如果开启了一个会产生的io操作 如果没有join 当其他任务结束时这个任务会立即结束不会等待结束,所以要确保给每个任务都添加到join


原文地址:https://www.cnblogs.com/fanbiyong/p/10221212.html

时间: 2024-10-12 19:28:28

回调函数 协程的相关文章

关于C10K、异步回调、协程、同步阻塞

最近到处在争论这些话题,发现很多人对一些基础的常识并不了解,在此发表一文做一下解释.此文未必能解答所有问题,各位能有一个大致的了解就好. C10K的由来 大家都知道互联网的基础就是网络通信,早期的互联网可以说是一个小群体的集合.互联网还不够普及,用户也不多.一台服务器同时在线100个用户估计 在当时已经算是大型应用了.所以并不存在什么C10K的难题.互联网的爆发期应该是在www网站,浏览器,雅虎出现后.最早的互联网称之为Web1.0, 互联网大部分的使用场景是下载一个Html页面,用户在浏览器中

python协程,线程的其他方法

OK 这一篇主要是协程的,还落下了点线程的方法,先说线程, 线程池 线程池回调函数 协程 一. 线程池   线程池顾名思义就是跟是跟进程池一样的 到这里就差我们的线程池没有讲了,我们用一个新的模块给大家讲,早期的时候我们没有线程池,现在python提供了一个新的标准或者说内置的模块,这个模块里面提供了新的线程池和进程池,之前我们说的进程池是在multiprocessing里面的,现在这个在这个新的模块里面,他俩用法上是一样的. 为什么要将进程池和线程池放到一起呢,是为了统一使用方式,使用thre

day05 协程函数,递归函数,匿名函数lambda,内置函数map reduce filter max min zip sorted,匿名函数lambda和内置函数结合使用,面向过程编程与函数编程,模块与包的使用,re模块内置函数

基础篇 本章大纲: 协程函数 递归函数 匿名函数lambda 内置函数map reduce filter  max min zip sorted 匿名函数lambda和内置函数结合使用 面向过程编程与函数编程 模块与包的使用 re模块内置函数 一,协程函数 注意:函数先定义,后使用.这是函数第一原则.函数主要分为定义,调用 1.1,什么是协程函数 协程函数特点:yield变为表达式,可以通过g.send(value)传值,用send传值时协程函数需要初始化,也可以说是生成器函数的一种 1.2,协

python第五天:协程,匿名函数,递归函数,模块导入,re模块

上节回顾 函数对象 函数可以被当成数据来传递 def func(): pass 1.可以被引用.f=fun 2.可以当做参数传递给另外一个函数 3.可以作为函数的返回值 4.可以当做容器类型的元素 比如用户有10多个参数,我们不需要写10多个if判断.可以写一个字典. dic = {'func1':func1,'func2':func2} 调用个时候就用dic['func1']() 函数的嵌套 函数的嵌套可以分为两种:嵌套定义和嵌套调用. 嵌套调用:函数的执行过程中调用其他的函数,可以更加细化的

Python实现基于协程的异步爬虫

一.课程介绍 1. 课程来源 本课程核心部分来自<500 lines or less>项目,作者是来自 MongoDB 的工程师 A. Jesse Jiryu Davis 与 Python 之父 Guido van Rossum.项目代码使用 MIT 协议,项目文档使用 http://creativecommons.org/licenses/by/3.0/legalcode 协议. 课程内容在原文档基础上做了稍许修改,增加了部分原理介绍,步骤的拆解分析及源代码注释. 2. 内容简介 传统计算机

协程Coroutine

协程是一种用户态的轻量级线程. server的发展如下: IO密集型应用: 多进程->多线程->事件驱动->协程 CPU密集型应用:多进程-->多线程 如果说多进程对于多CPU,多线程对应多核CPU,那么事件驱动和协程则是在充分挖掘不断提高性能的单核CPU的潜力. 异步事件驱动模型中,把会导致阻塞的操作转化为一个异步操作,主线程负责发起这个异步操作,并处理这个异步操作的结果.由于所有阻塞的操作都转化为异步操作,理论上主线程的大部分时间都是在处理实际的计算任务,少了多线程的调度时间,

Python开发基础--- 进程间通信、进程池、协程

进程间通信 进程彼此之间互相隔离,要实现进程间通信(IPC),multiprocessing模块支持两种形式:队列和管道,这两种方式都是使用消息传递的. 进程队列queue 不同于线程queue,进程queue的生成是用multiprocessing模块生成的. 在生成子进程的时候,会将代码拷贝到子进程中执行一遍,及子进程拥有和主进程内容一样的不同的名称空间. 示例1: 1 import multiprocessing 2 def foo(): 3 q.put([11,'hello',True]

进程、线程和协程的理解-自己随笔

1. IO 操作不占用CPU(从硬盘读数据,从网络读数据,从内存读取数据) 计算占用CPU,例如1+1=2的计算就是占用CPU的. python 多线程,不适合CPU密集操作系统的任务,适合IO操作密集型的任务. 2. 进程.线程和协程之间的关系和区别也困扰我一阵子了,最近有一些心得,写一下. 进程拥有自己独立的堆和栈,既不共享堆,亦不共享栈,进程由操作系统调度. 线程拥有自己独立的栈和共享的堆,共享堆,不共享栈,线程亦由操作系统调度(标准线程是的). 协程和线程一样共享堆,不共享栈,协程由程序

关于协程的学习 &amp; 线程栈默认10M

先看的这篇文章:http://blog.csdn.net/qq910894904/article/details/41699541 以nginx为代表的事件驱动的异步server正在横扫天下,那么事件驱动模型会是server端模型的终点吗? 我们可以深入了解下,事件驱动编程的模型. 事件驱动编程的架构是预先设计一个事件循环,这个事件循环程序不断地检查目前要处理的信息,根据要处理的信息运行一个触发函数.其中这个外部信息可能来自一个目录夹中的文件,可能来自键盘或鼠标的动作,或者是一个时间事件.这个触