我是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