【问题标题】:Can gevent workers be used in the python 3 app engine standard environment?gevent worker可以在python 3 app engine标准环境中使用吗?
【发布时间】:2019-05-30 12:16:57
【问题描述】:

尝试使用它们会给我以下错误:

Traceback (most recent call last):
  File "/env/lib/python3.7/site-packages/gunicorn/arbiter.py", line 583, in spawn_worker
    worker.init_process()
  File "/env/lib/python3.7/site-packages/gunicorn/workers/ggevent.py", line 196, in init_process
    self.patch()
  File "/env/lib/python3.7/site-packages/gunicorn/workers/ggevent.py", line 75, in patch
    fileno=s.sock.fileno()))
  File "/env/lib/python3.7/site-packages/gevent/_socket3.py", line 114, in __init__
    self._sock = self._gevent_sock_class(family, type, proto, fileno)
OSError: [Errno 92] Protocol not available: 'protocol'

python 3 环境不支持套接字吗?这就是它不起作用的原因吗?

我的应用程序在其他 Web 服务器上花费了大量时间,因此使用异步工作器对于获得良好的性能是必要的。同时我会尝试使用eventletworkers。

编辑:包括更多关于使用的上下文

app.yaml

runtime: python37
instance_class: F2

entrypoint: gunicorn -c gunicorn.conf.py -b :$PORT my_project.server:app

gunicorn.conf.py

# Recommended number of workers based on instance size:
# https://cloud.google.com/appengine/docs/standard/python3/runtime#entrypoint_best_practices
workers = 2
# Use an asynchronous worker as most of the work is waiting for websites to load
worker_class = 'gevent'

由于是在 gunicorn 发布期间,我认为应用定义上下文不会有用。但是为了完整起见,我将启动一个基本的烧瓶应用程序。比如:

my_project/server.py

from flask import Flask

from my_project.handlers import run

app = Flask(__name__)
app.register_blueprint(run, url_prefix='/run')

【问题讨论】:

  • 你能举一个例子来说明你是如何使用 gevent 的吗?
  • 添加了一些上下文,感谢您的快速回复!让我知道是否还有其他用处。有一个关于 gevent 工作人员的note in the appengine flex documentation,但我相信它不再相关,因为链接的问题已关闭。
  • 谢谢,我可以重现这个。现在调查一下。
  • 我在 gevent、应用引擎标准和 python3 中遇到了同样的错误。我也用 eventlet 作为工人类进行了测试,但它也不能正常工作。
  • 是的,gunicorn 的 eventlet worker 几乎没用,因为它实际上并没有修补任何阻塞调用(参见 github.com/benoitc/gunicorn/pull/1884)。我们最终只是切换到了 appengine flex(出于其他原因),这让我们现在可以使用 gevent worker。如果您想查看我们的设置,请查看 prod.yamlgunicorn.conf.pygevent_grpc_worker.py 此处:github.com/Recidiviz/pulse-data

标签: google-app-engine gunicorn gevent google-app-engine-python


【解决方案1】:

我有同样的错误。如果我们想使用 gevent,我认为我们仅限于 GAE FlexibleCloud Run on GKE

GAE 标准 在沙盒 (gVisor) 中运行,并且一些操作受到限制(我注意到这个尝试 Cloud Rungevent 有相同的问题)

你看到的错误是这个:

Container Sandbox Limitation: Unsupported syscall 
getsockopt(0x5,0x1,0x26,0x7e11bd8ddf20,0x7e11bd8ddf24,0x4)

【讨论】:

    猜你喜欢
    • 2015-01-26
    • 2019-04-20
    • 1970-01-01
    • 2019-01-30
    • 1970-01-01
    • 1970-01-01
    • 2018-03-12
    • 2019-10-27
    • 2018-10-07
    相关资源
    最近更新 更多