我是gevents和greenlets的新手.我找到了一些关于如何使用它们的好文档,但是没有一个能让我证明我应该如何以及何时使用greenlets!
我不确定的是,如果它们基本上是共同惯例,它们如何为我们提供并发性.
我安装了以emperor模式运行的uWSGI.Vassals使用不同的python版本,因此我不能在uWSGI二进制文件中嵌入python插件.
有了这个,我想在其中一个封锁中使用asyncio循环引擎,但我无法弄清楚如何运行非嵌入的asyncio插件和greenlet插件.
到目前为止我尝试过的:
将asyncio和greenlet嵌入到uWSGI中,使用:
CFLAGS="-I/usr/local/include/python3.4" make PYTHON=python3.4 asyncio
Run Code Online (Sandbox Code Playgroud)
建立uWSGI.但这也将嵌入python插件,我不想要它.
使用以下方法构建asyncio和uwsgi作为外部插件:
PYTHON=python3.4 ./uwsgi --build-plugin "plugins/greenlet greenlet"
PYTHON=python3.4 ./uwsgi --build-plugin "plugins/greenlet greenlet"
Run Code Online (Sandbox Code Playgroud)
构建插件,但插件无法加载:
/usr/local/lib/uwsgi/asyncio_plugin.so:unfined defined symbol:up
/usr/local/lib/uwsgi/greenlet_plugin.so:undefined symbol:up
在日志中.
//编辑
我已经发现必须在设置中的asyncio和greenlet之前启用python插件,因此错误不再发生,但greenlet不起作用,当前greenlet中没有父级.
我还能尝试做些什么?我敢打赌,在python3.4插件中嵌入asyncio和greenlet会起作用,但我不知道该怎么做或者甚至可能.
目前我正在使用内置所需插件的第二个皇帝,但由于平台的限制,我不能再使用该解决方案了.
新版PyPy附带集成的Stackless.据我所知,捆绑的Stackless与2001年的Stackless起源不同.所以主要是带调度程序的绿色线程框架.
Greenlet是Stackless的旋转,它提供Stackless绿色线程功能作为扩展模块.
有没有使用"原生"的任何利益无堆栈从PyPy比PyPy + greenlet +一些调度(如:GEVENT)?或问题是我不能使用PyPy的那些类型的扩展?更具体一点:我知道PyPy有自己的greenlet实现(基于continulet).但我很好奇在PyPy中将外部greenlet与gevent和内部greenlet连接起来的可能性.
PyPy是否附带了一个用于Stackless的异步IO库而不是标准的?
我知道stackless本身和python的其他异步轻线程扩展(eventlet,gevent,twisted ......).因此,我不是在寻找它们之间的差异,而是通过无堆叠构建而形成的pypy的优势.
我正在尝试创建一个具有事件循环的GUI框架.一些线程来处理UI,一些线程用于事件处理.我搜索了一下,找到了这三个库,我想知道哪一个更好用?优缺点都有什么?
我可以使用这三个库中的一个,甚至可以使用python 线程或并发库为自己创建一些东西.
我希望分享任何经验,基准和比较.
我正在使用Flask + gevent,并希望在greenlet flask.g
的目标函数内访问全局应用程序.我正在使用copy_current_request_context
装饰器,其情况与文档中给出的示例非常相似:
import gevent
from flask import copy_current_request_context, g
@app.route('/')
def index():
g.user_data = 'foobar'
g.more_user_data = 'baz'
@copy_current_request_context
def do_some_work():
some_func(g.user_data, g.more_user_data)
...
gevent.spawn(do_some_work)
return 'Regular response'
Run Code Online (Sandbox Code Playgroud)
但是,我收到以下错误:
AttributeError: '_AppCtxGlobals' object has no attribute 'user_data'
Run Code Online (Sandbox Code Playgroud)
我认为在复制请求上下文时会推送新的应用程序上下文?我在烧瓶代码中设置跟踪在这里,这似乎是这样.因此,错误并不令人惊讶,因为该flask.g
对象的应用程序上下文的范围为0.10(请参阅http://flask.pocoo.org/docs/0.12/api/#flask.Flask.app_ctx_globals_class).
显然,我可以将用户数据作为参数传递给目标函数:
import gevent
from flask import g
@app.route('/')
def index():
g.user_data = 'foobar'
g.more_user_data = 'baz'
def do_some_work(user_data, more_user_data):
some_func(user_data, more_user_data)
...
gevent.spawn(do_some_work, g.user_data, g.more_user_data)
return 'Regular response'
Run Code Online (Sandbox Code Playgroud)
这很好用,但我希望尽可能使用flask.g
.
我需要在django中开发一个实时的最近活动源(使用AJAX长轮询),我想知道什么是服务器端的最佳策略.
伪代码:
def recent_activity_post_save():
notify_view()
[in the view]
while not new_activity():
sleep(1)
return HttpResponse(new_activity())
Run Code Online (Sandbox Code Playgroud)
首先要记住的是每秒查询数据库.不可行.其他选择:
什么是最好的方式去这里?
好像当我有一个继承自gevent.Greenlet的抽象基类(它继承自C扩展模块greenlet:https://github.com/python-greenlet/greenlet)时,实现它的类不会引发任何关于未实现方法的abc错误.
class ActorBase(gevent.Greenlet):
__metaclass__ = abc.ABCMeta
@abc.abstractmethod
def foo(self):
print "foo"
class ActorBaseTest(ActorBase):
def bar(self):
print "bar"
abt = ActorBaseTest() # no errors!
Run Code Online (Sandbox Code Playgroud)
如果我从object
它继承失败按预期方式:
class ActorBase(object):
__metaclass__ = abc.ABCMeta
@abc.abstractmethod
def foo(self):
print "foo"
class ActorBaseTest(ActorBase):
def bar(self):
print "bar"
>>> abt = ActorBaseTest()
Traceback (most recent call last):
File "/home/dw/.virtualenvs/prj/local/lib/python2.7/site-packages/IPython/core/interactiveshell.py", line 2827, in run_code
exec code_obj in self.user_global_ns, self.user_ns
File "<ipython-input-6-d67a142e7297>", line 1, in <module>
abt = ActorBaseTest()
TypeError: Can't instantiate abstract class …
Run Code Online (Sandbox Code Playgroud) 我有一个 Flask 应用程序,在尝试将 Flask 与faust集成时出现此错误。
应用程序.py
import mode.loop.eventlet
import logging
import logging.config
import json
from flask import Flask
from elasticapm.contrib.flask import ElasticAPM
def create_app():
app = Flask(__name__)
configure_apm(app)
configure_logging()
register_blueprints(app)
register_commands(app)
return app
Run Code Online (Sandbox Code Playgroud)
主要.py
from flask import jsonify
from litmus.app import create_app
from intercepter import Intercepter
app = create_app()
app.wsgi_app = Intercepter(app.wsgi_app , app)
@app.route('/status')
def status():
return jsonify({'status': 'online'}), 200
Run Code Online (Sandbox Code Playgroud)
另一个控制器
@api_blue_print.route('/v1/analyse', methods=['POST'])
def analyse():
analyse_with_historic_data.send(value=[somedata])
return jsonify({'message': 'Enqueued'}), 201
Run Code Online (Sandbox Code Playgroud)
analysis_with_historic_data.py
@app.agent(analysis_topic)
async def analyse_with_historic_data(self, stream):
async for …
Run Code Online (Sandbox Code Playgroud) 运行时警告:greenlet.greenlet 大小已更改,可能表示二进制不兼容。预期来自 C 头文件的 144,来自 PyObject 的 152
所有工人都被解雇了。
2020-09-28T14:09:41.864089908Z [2020-09-28 14:09:41 +0000] [31] [INFO] 使用 pid 启动 worker:31 2020-09-28T14:09:4429309303 -28 14:09:43 +0000] [32] [INFO] 使用 pid 启动 worker:32 2020-09-28T14:09:44.317436676Z [2020-09-28 14:09:44 +0000] [33] INFO] 使用 pid 启动 worker:33 2020-09-28T14:09:44.795236476Z [2020-09-28 14:09:44 +0000] [34] [INFO] 使用 pid 启动 worker:34
一周前它工作正常,现在我开始遇到问题。
greenlets ×10
python ×9
gevent ×6
concurrency ×2
flask ×2
abc ×1
azure-devops ×1
celery ×1
coroutine ×1
devops ×1
django ×1
erlang ×1
eventlet ×1
inheritance ×1
pypy ×1
python-3.x ×1
rabbitmq ×1
uwsgi ×1