- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
greenlet包被 gevent 和 eventlet 用于异步 IO。它是作为 C 扩展编写的,因此不适用于 Jython 或 IronPython。如果不关心性能,那么在纯 Python 中实现 greenlet API 的最简单方法是什么。
一个简单的例子:
def test1():
print 12
gr2.switch()
print 34
def test2():
print 56
gr1.switch()
print 78
gr1 = greenlet(test1)
gr2 = greenlet(test2)
gr1.switch()
应该打印 12、56、34(而不是 78)。
最佳答案
这种事情可以通过自 2.5 版开始内置到标准 Python 发行版中的协程来实现。如果 IronPython 和 co 完全兼容 Python 2.5 的所有特性(我相信它们是),那么您应该能够使用这个习惯用法。
见 this post有关如何使用它们的更多信息 :) 具体来说,您将对 PDF 感兴趣。作者只使用纯 Python 构建了一个系统,该系统提供了与无堆栈 Python 或 Greenlet 模块类似的功能。
您可能还想查看 Gogen或 Kamelia供想法:这些项目都有纯 python 协程实现,您可以采用或用作您自己实现的引用。看看this page对 cogen
做事方式的简要介绍。
请注意这里的协程实现与 greenlet
实现之间存在一些差异。纯 python 实现都使用某种外部调度程序,但想法基本相同:它们为您提供了一种运行轻量级、协作任务的方法,而无需求助于线程。此外,上面链接的两个框架都面向异步 IO,非常类似于 greenlet
本身。
这是您发布但使用 cogen
重写的示例:
from cogen.core.coroutines import coroutine
from cogen.core.schedulers import Scheduler
from cogen.core import events
@coroutine
def test1():
print 12
yield events.AddCoro(test2)
yield events.WaitForSignal(test1)
print 34
@coroutine
def test2():
print 56
yield events.Signal(test1)
yield events.WaitForSignal(test2)
print 78
sched = Scheduler()
sched.add(test1)
sched.run()
>>> 12
>>> 56
>>> 34
它比 greenlet
版本更明确一点(例如使用 WaitForSignal
显式创建恢复点),但您应该了解大致的概念。
编辑:我刚刚确认这可以使用 jython
KidA% jython test.py
12
56
34
关于python - greenlet API的纯python实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2939678/
我正在运行一个可以在这里找到的模块:https://github.com/danieliu/play-scraper 我在python文件中的代码如下: 导入 play_scraper print(p
这是什么意思?我该如何解决? gcc -pthread -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -I/home/j
可以requests库 session 对象可以在 gevented 程序中安全地跨 greenlets 使用吗? 编辑 - 添加更多说明: 当一个 greenlet 因调用套接字向服务器发送请求而屈
我使用的是 Windows 10,我从源代码安装 Odoo ( https://github.com/odoo/odoo/tree/aa0554d224337e1d966479a351a3ed059d
greenlet包被 gevent 和 eventlet 用于异步 IO。它是作为 C 扩展编写的,因此不适用于 Jython 或 IronPython。如果不关心性能,那么在纯 Python 中实现
我正在寻找一种通过另一个函数传递函数参数的方法,其方式与 Stackless 的 tasklet 实例化相同: stackless.tasklet(function_being_called)(*ar
我知道阻塞代码对于事件循环(即 NodeJS)来说是一种罪过,但是对于 greenlets(我认为是绿色线程)呢?运行调用阻塞函数的代码是否有问题? 最佳答案 没有 gevent 提供的事件循环的 G
我将 bottle & gevent 用于我的 python (2.7.6) 应用程序。 # -*- coding: utf-8 -*- from __future__ import unicode_
假设我有一个 Event() 进来,并且有 X 个 greenlets 在等待这个事件。当那些等待的 greenlets 完成后,我想做一个 Publish() 我怎么知道什么时候发布? 原理图: e
我对 greenlets 和 gevent 还是个新手,但据我了解,greenlets 会在显式 yield 语句或阻塞 I/O 操作时屈服于其他 greenlets。但是使用 print 语句阻塞写
我正在尝试实现一个简单的 gevent 设置。有一个发件人应该并行向多个服务员发送一个值。 Event 类最接近解决此问题,如下所示。 每三秒,setter 创建一个事件,解除对所有等待者的阻塞。事件
我希望为 gevent greenlet 分配自定义名称/标识符。 Gevent 已经分配了一个唯一的名称: def name(self): """ The greenlet name
我想编写一个程序,其中有几个永远运行的相互调度的函数。我想到使用 gevent 来达到这个目的。他们对长期运行的 greenlet 有什么问题吗? 我正在编写这种格式的程序 from gevent.p
我正在 try catch greenlet 中引发的异常。根据this tutorial ,不幸的是“在 Greenlet 中引发异常,留在 Greenlet 中”。在下面的代码中,我有一个生成爬行
在使用 gevent 时,每当子 greenlet 抛出异常时,我希望它冒泡到父级(理想情况下让父级抛出异常)。在 greenlets 的文档中,它说这是自动完成的,但在 gevent 中似乎并非如此
我正在搜索如何在一个程序中的 gevent 和其他 greenlet 中运行服务器。所以我想要服务器(多个连接)和一个或两个其他 greenlets。这可能吗?如果是,那么如何? 最好的问候,马特。
我正在使用 gevent 下载一些 html 页面。有些网站速度太慢,有些网站会在一段时间后停止服务请求。这就是为什么我必须限制我提出的一组请求的总时间。为此,我使用 gevent“Timeout”。
当我尝试使用 kill() 杀死一个 greenlet 时,'block' 参数默认为 True, Greenlet.kill(self, exception, block, timeout) 文档说
当我使用标准的 logging 包从 greenlets 中打印出日志语句时,我得到的文本如下所示: 2014-02-06 22:38:43,428 [INFO] (11396-Dummy-2) ev
我是异步编程新手。我正在做一个小型 POC,我想了解 greenlets 与共享对象的行为方式。我写了这段代码 - from gevent import monkey, sleep from geve
我是一名优秀的程序员,十分优秀!