标签: greenlets

格林莱特与 主题

我是gevents和greenlets的新手.我找到了一些关于如何使用它们的好文档,但是没有一个能让我证明我应该如何以及何时使用greenlets!

  • 他们真正擅长什么?
  • 在代理服务器中使用它们是不是一个好主意?
  • 为什么不是线程?

我不确定的是,如果它们基本上是共同惯例,它们如何为我们提供并发性.

python concurrency coroutine gevent greenlets

130
推荐指数
4
解决办法
4万
查看次数

使用外部python插件运行asyncio循环引擎

我安装了以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会起作用,但我不知道该怎么做或者甚至可能.

目前我正在使用内置所需插件的第二个皇帝,但由于平台的限制,我不能再使用该解决方案了.

uwsgi python-3.x greenlets python-asyncio

18
推荐指数
1
解决办法
808
查看次数

在PyPy和PyPy + greenlet中无堆叠 - 差异

新版PyPy附带集成的Stackless.据我所知,捆绑的Stackless与2001年的Stackless起源不同.所以主要是带调度程序的绿色线程框架.

Greenlet是Stackless的旋转,它提供Stackless绿色线程功能作为扩展模块.

有没有使用"原生"的任何利益无堆栈PyPyPyPy + greenlet +一些调度(如:GEVENT)?或问题是我不能使用PyPy的那些类型的扩展?更具体一点:我知道PyPy有自己的greenlet实现(基于continulet).但我很好奇在PyPy中将外部greenlet与gevent和内部greenlet连接起来的可能性.

PyPy是否附带了一个用于Stackless的异步IO库而不是标准的?

我知道stackless本身和python的其他异步轻线程扩展(eventlet,gevent,twisted ......).因此,我不是在寻找它们之间的差异,而是通过无堆叠构建而形成的pypy的优势.

python pypy gevent greenlets python-stackless

14
推荐指数
1
解决办法
4787
查看次数

Eventlet vs Greenlet vs gevent?

我正在尝试创建一个具有事件循环的GUI框架.一些线程来处理UI,一些线程用于事件处理.我搜索了一下,找到了这三个库,我想知道哪一个更好用?优缺点都有什么?

我可以使用这三个库中的一个,甚至可以使用python 线程并发库为自己创建一些东西.

我希望分享任何经验,基准和比较.

python multithreading gevent eventlet greenlets

14
推荐指数
1
解决办法
1万
查看次数

访问greenlet里面的flask.g

我正在使用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.

python gevent flask greenlets

13
推荐指数
1
解决办法
726
查看次数

轻量级通知技术

我需要在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)

首先要记住的是每秒查询数据库.不可行.其他选择:

  1. 使用缓存作为通知服务
  2. 使用像芹菜这样的专业工具(我宁愿不这样做,因为它看起来有点矫枉过正)

什么是最好的方式去这里?

python django rabbitmq celery greenlets

12
推荐指数
1
解决办法
1962
查看次数

类似Erlang的Python并发?

有没有像Erlang那样具有并发性的Python,特别是网络上的透明参与者?我看过像greenletstackless这样的东西,但它们似乎没有为演员提供网络透明度.

我仍然不能完全跳过Erlang/OTP的障碍,所以我很感兴趣,如果有更接近家的东西.

python concurrency erlang greenlets python-stackless

11
推荐指数
2
解决办法
3553
查看次数

python抽象基类可以从C扩展继承吗?

好像当我有一个继承自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)

python inheritance abc gevent greenlets

11
推荐指数
1
解决办法
801
查看次数

greenlet.error:无法切换到不同的线程

我有一个 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)

python multithreading flask greenlets

11
推荐指数
1
解决办法
1万
查看次数

Greenlet 运行时错误和在 docker 中部署的应用程序不断启动所有工作人员

运行时警告: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

一周前它工作正常,现在我开始遇到问题。

python gevent greenlets devops azure-devops

10
推荐指数
1
解决办法
4688
查看次数