首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

PEP 342--增强型生成器:

Eby 创建日期: 2005-05-10 合入版本: 2.5 译者 :豌豆花下猫(Python猫 公众号作者) 目录 简介 动机 规格摘要 规格:发送到生成器 新生成器方法:send(value)...这些应用程序可以编写来运行阻塞 socket I/O,通过给 I/O 调度器提供控制,直到数据被发送或变为可用。...因为生成器在生成器函数体头部执行,所以在刚刚创建生成器时不会有 yield 表达式来接收,因此,当生成器刚启动时,禁止使用 None 参数来调用 send() ,如果调用了,就会抛出 TypeError...所以,在与通信前,必须先调用 next() 或 send(None) ,来程序推进到第一个 yield 表达式。...被调用所产生生成器,会被返回给调用方。类似地,如果被调用抛出异常,该异常也会传导给调用者。

53310
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    python1:yield使用

    函数,因为生成器还没有启动,没有在yield语句处暂停,所以开始无法发送数据 # 发送 None 可以达到相同效果 my_coro.send(None) next(my_coro)# 此时处于...如果还未激活(GEN_CREATED 状态)要调用next(my_coro) 激活,也可以调用my_coro.send(None) 如果创建对象后立即把None之外发给它,会出现下述错误...使用装饰器预激 我们已经知道,如果不预激,不能使用send() 传入None 数据。所以,调用my_coro.send(x)之前,一定要调用next(my_coro)。...由上边例子我们可以知道,如果想让退出,可以发送给它一个特定。比如None和Ellipsis。....throw(...)和.close() 方法控制 下一部分介绍: 终止时如何返回 yield新句法用途和语义 最后,感谢女朋友支持。

    75730

    Python3中生成器进阶(sendclosethrow)

    ,有人说它是有多个入口函数,也有人说它是可以暂停函数,且可以向暂停地方传入,它这种函数执行不再是依赖于栈。”可以暂停函数”?生成器可以暂停啊,是的,那么生成器是如何变成呢?...value to a just-started generator 看到最后错误提示没,说生成器刚刚开始,无法发送一个不为None。...那是因为前面说过send方法是发送给html = yield “http://www.baidu.com"对象,但是这时候如果生成器在初始化时候没有启动生成器的话是无法接收信息,也就是根本运行不到这行代码...,因此你在send一个None它就会报错,其实就是生成器还未启动罢了。...在使用send方法发生None对象时,必须先启动生成器,可以通过next方法,或者是send(None)方式。

    1.1K20

    python中异步实践与tornado应用

    最近项目中由于在python3中使用tornado,之前也有用过,是在python2中,由于对于理解不是很透彻,只是套用官方文档中写法,最近比较细致看了下用法,也tornado在python3...异步基础 要理解,先要理解异步,要理解异步,先要理解同步,与同步相关概念又有阻塞与阻塞,下面一一做简单介绍。 阻塞 阻塞状态指程序未得到所需计算资源时被挂起状态。...与 next() 函数相关还有一个 send() 函数,next 函数传递None , send 函数可以传递对应。...其实next()和send()在一定意义上作用是相似的,区别是send()可以传递yield表达式进去,而next()不能传递特定,只能传递None进去。...,程序又中止了,整个脚本执行结束,需要提醒是,第一次调用时,请使用next()语句或是send(None),不能使用send发送一个None,否则会出错,因为没有yield语句来接收这个

    51900

    理解、LiveData 和 Flow

    如何启动和取消协 在 Jetpack 组件里,我们为各个组件提供了对应 scope,比如 ViewModel 就有与之对应 viewModelScope,如果您想在这个作用域里启动,使用如下代码即可...LiveData 启动,然后将其操作结果赋给 MLD 这个做法并不理想。...绝大部分情况下,取消操作是自动,毕竟我们在对应作用域里启动一个时,也同时明确了它会在何时被取消。但我们有必要讲一讲如何在内部来手动取消协。...如前所述,我们使用 LiveData 连接 View 和 ViewModel,而在 ViewModel 这里我们则使用刚刚提到 liveData 构造方法来打通 LiveData 和协,再往右就是调用...比如下面这段代码,api 支持三个回调分支 onNextValue、onApiError 和 onCompleted,我们可以得到结果分支里使用 offer 方法传给 Flow,在发生错误分支里

    2.2K20

    PHP Swoole学习笔记,持续记录

    启动失败会立即返回 false,启动成功后进入事件循环,等待客户端连接请求。start 方法之后代码不会执行。...如果没有注册,服务器程序无法启动。...所有的必须在容器里面创建,Swoole 程序启动时候大部分情况会自动创建容器,Serverenable_coroutine 控制事件回调是否自动创建。...在编程中可直接使用 try/catch 处理异常。但必须在内捕获,不得跨捕获异常。当退出时,发现有未捕获异常,引起致命错误。...因为 Swoole 是单进程单线程模型,使用 go 创建会优先执行,子执行完毕或挂起时,重新回到父向下执行代码,如果子挂起后,父退出,不影响子执行, Swoole

    2.4K50

    Kotlin---使用异步

    扇入允许多个协可以发送到同一个通道。...它启动了一个单独,这是一个轻量级线程并与其它所有的一起并发工作。...不同之处在于 launch 返回一个 Job并且不附带任何结果,而 async 返回一个 Deferred—— 一个轻量级阻塞 future, 这代表了一个将会在稍后提供结果 promise。...in $time ms") 安全 与线程一样,对于数据操作无法保持原子性,所以在中,需要使用原子性数据结构,例如AotimicInteger等,或者使用mutex.withLock,来处理数据原子性...一个 actor 是一个,而一个是按顺序执行,因此状态限制到特定可以解决共享可变状态问题。实际上,actor 可以修改自己私有状态,但只能通过消息互相影响(避免任何锁定)。

    2.8K20

    【Kotlin 多路复用技术 ② ( select 函数原型 | SelectClauseN 事件 | 查看挂起函数是否支持 select )

    多路复用技术 ① ( 多路复用技术 | await 多路复用 | Channel 通道多路复用 ) 中 , 介绍了 多路复用技术 , 多路复用 主要使用 select 代码块 实现 ,...在 select 代码块中 调用多个协 onAwait 函数 , 哪个协先返回数据 , 就选择该数据作为返回 ; // 同时执行两个协, 哪个先执行完毕, 就取哪个协执行结果 val...相反,每个可选择挂起函数都具有 * 对应挂起版本,可以与常规“when”表达式一起使用来选择一个 * 选项,如果没有选项可以立即选择,则执行默认(' else ')操作。...如果当前[Job]被取消或完成 * 函数挂起后,该函数立即恢复[CancellationException]。 * 有**立即取消保证**。...如果作业被取消,而此函数被取消 * 暂停,无法成功恢复。参见[suspendCancellableCoroutine]文档了解底层细节。 * * 注意,该函数在未挂起时不会检查是否取消。

    1.2K20

    Python asyncio之学习总结

    实践环境 Python 3.6.2 什么是 (Coroutine)一种电脑程序组件,该程序组件通过允许暂停和恢复任务,为抢占式多任务生成子程序。...程序遇到await关键词时,会将程序控制权交给主程序,由主程序分配给其它。当可等待对象返回结果,并且此时程序控制权还被其它占用时,则被挂起依旧无法继续往下运行,直到获取程序控制权。...必须返回None。 AbstractEventLoop.run_until_complete(asyncio.wait(tasks)) 运行直到asyncio.wait(tasks)运行完成。...Future Future,是对封装,代表一个异步操作最终结果--将来执行或没有执行任务结果,其会在将来被计算出来。...由于我们无法控制原因,对于挂起,只返回一个堆栈帧。 print_stack(*, limit=None, file=None) 打印此任务堆栈或traceback。

    904100

    Python 高级教程之线程进程和协

    ''' 进程缺点 无法即时完成任务带来大量上下文切换代价与时间代价。 进程上下文:当一个进程在执行时,CPU所有寄存器中、进程状态以及堆栈中内容被称为该进程上下文。...例如在作业右侧—— line = (yield) 我们发送给任何都会被(yield)表达式捕获并返回。 可以通过send()方法发送到。...例如,考虑这个协,它打印出带有前缀“Dear”名称。我们将使用 send() 方法将名称发送到。...在这个调用之后,执行前进到第一个 yield 表达式,现在执行暂停并等待发送到 corou 对象。当第一个被发送给它时,它会检查前缀和打印名称(如果存在前缀)。...链接以创建管道 可用于设置管道。我们可以使用 send() 方法链接在一起并通过管道推送数据。管道需要: 初始源(生产者)派生整个管道。生产者通常不是,它只是一个简单方法。

    35431

    在 Android 开发中使用 | 上手指南

    通常,您应使用 launch 从常规函数中启动。因为常规函数无法调用 await (记住,它无法直接调用 suspend 函数),所以 async 作为主要启动方法没有多大意义。...这意味着如果使用 async 启动,它会静默地异常丢弃。...另外,如果随意启动,可能会导致潜在任务泄漏 (work leak)。调用方可能感知不到启用了新,也就意味着无法对其进行追踪。...但是当出现需要比调用方生命周期更长情况时,就可能需要考虑结构化并发编码方式了,只是这种情况比较罕见。...因此,使用结构化编程来追踪结构化,并进行错误处理和任务取消,将是非常不错做法。 如果您之前一直未按照结构化并发方法编码,一开始确实一段时间去适应。

    1.5K20

    TiDB EcoSystem Tools 原理解读(一):TiDB-Binlog 架构演进与实现原理

    在生成 SQL 时,我们会使用主键/唯一键作为该条 SQL key,通过对 key 进行 hash 来 SQL 发送到对应中。...但是有些 SQL 是相关,如果被分到了不同,那 SQL 执行顺序就不能得到保证,造成数据不一致。...为了避免这种情况发生,Drainer 中加入了冲突检测机制,如果检测出来两条 SQL 存在冲突(修改了同一行数据),则暂时不将后面的 SQL 发送到,而是生成一个 Flush 类型 job 发送到所有的...接着才会把该条有冲突 SQL 发送到对应中。...[3]与 keys 中[3]存在冲突,发送 Flush job 到所有,SQL1 和 SQL2 被执行,清空 keys; SQL3 发送到指定,同时更新 keys 为[3]。

    93830

    【Kotlin 】Channel 通道 ③ ( CoroutineScope#produce 构造生产者 | CoroutineScope#actor 构造消费者 )

    #produce 函数原型 CoroutineScope#produce 函数原型 : /** * 启动一个新,通过发送到通道来生成流 * 并返回对引用作为[receichannnel...* * 此中任何未捕获异常将以此异常作为原因和关闭通道 * 结果通道变成_failed_,因此此后任何试图从它接收尝试都会抛出异常。...启动_lazy。在这种情况下, * 它将在第一条消息上隐式启动 * 【发送】【SendChannel。发送到此演员邮箱通道。...* * 此中未捕获异常将以此异常作为原因和关闭通道 * 结果通道变成_failed_,因此任何发送到该通道尝试都会抛出异常。...* @param start 启动选项。缺省为[coroutinstart . default]。

    50010

    Python 中进程、线程、、同步、异步、回调

    刚刚结束 PyCon2014 上海站,来自七牛云存储 Python 高级工程师许智翔带来了关于 Python 分享《Python中进程、线程、、同步、异步、回调》。...那么这个句柄就永远不会被新调用返回,哪怕上面其实充满了数据——因为句柄无法经历从就绪变为就绪过程。 类似CFS,epoll也使用了红黑树——不过是用于组织加入epoll所有fd。...因此,一段代码,中间没有可能导致阻塞调用,执行在单个线程中。那么这段内容可以被视为同步。 我们经常可以看到某些应用,一启动就是数个进程。这并不是跨进程调度。...一般来说,这是一大群fd分给多个进程,每个进程自己再做fd-对应调度。 基于就绪通知框架 首先需要包装read/write,在发生read时候检查返回。...那么,如果我们不需要返回也不需要顺序外部效应呢?例如启动一个背景程序数据发送到对端,无需保证发送成功情况下。或者是开始一个数据抓取行为,无需保证抓取成功。

    1.6K50

    一文学会Python

    yield需要使用coroutine这个概念 相对于仅仅生成,函数可以动态处理传送进去,而最后通过yield返回。 执行 执行和生成器执行很相似。...使用修饰器 由【启动】中我们知道,启动一个需要记得调用next( )来开始,而这个启动器容易忘记使用。使用修饰器包一层,来让我们启动。...+线程【没有蛀牙】 下面看一个线程例子。 cothread.py 例子解析:第一部分:先新建一个队列。然后定义一个永久循环线程;这个线程可以将其中元素拉出消息队列,然后发送到目标里面。...同样不能创造循环: 堆栈发送正在构建一种调用堆栈(send()函数不返回,直到目标产生)。 如果调用一个正在发送进程,将会抛出一个错误。...在本段代码中,result返回是yield GetTid()GetTid实例或者是yield后面的None。 .执行send(sendval)以后,sendval被传入了yield表达式。

    1.4K100

    Python深入理解

    yield在用法: 在中yield通常出现在表达式右边,例如:datum = yield,可以产出,也可以不产出--如果yield关键字后面没有表达式,那么生成器产出None....对上述例子分析: yield 右边没有表达式,所以这里默认产出None 刚开始先调用了next(...)是因为这个时候生成器还没有启动,没有停在yield那里,这个时候也是无法通过send发送数据...send(None)方式激活),但是我们直接send,会提示如下错误: ?...通过上面的几个例子我们发现,我们如果想要开始使用时候必须通过next(...)方式激活,如果不预激,这个协无法使用,如果哪天在代码中遗忘了那么就出问题了,所以有一种预激装饰器,可以帮助我们干这件事...当传入我们定义异常时不会影响不会停止,可以继续send,但是如果是没有处理异常时候,就会报错,并且会被终止 让返回 通过下面的例子进行演示如何获取返回: 1 from

    1.1K90

    手把手教你使用 OpenResty 搭建高性能服务端!

    这样就可以服务器CPU空闲资源,用来服务客户端连接。 异步阻塞 希望访问数据库、访问网络,访问一些比较慢IO设备时,不要在等待上耗费大量时间。...在OpenResty中,每个worker使用一个LuaVM,每个请求被分配到worker时,将在这个LuaVM中创建一个coroutine程之间数据隔离,每个协具有独立全局变量_G。...Lua中和多线程下线程类似,都有自己堆栈、局部变量、指令指针…,但是和其他程序共享全局变量等信息。...线程和协主要不同在于:多处理器情况下,概念上来说多线程是同时运行多个线程,而是通过代码来完成切换,任何时刻只有一个程序在运行。并且这个在运行只有明确被要求挂起时才会被挂起。...分布式闭环 单机闭环会遇到2个主要问题 数据不一致 例如没有主从架构导致不同服务器数据不一致 遇到存储瓶颈 磁盘或内存遇到天花板 解决数据不一致比较好办法是采用主从或分布式集中存储,而遇到存储瓶颈就需要进行按业务键进行分片

    2.1K20
    领券