微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

当使用工作类 gevent 运行 gunicorn 时,Python Bigquery to_dataframe 函数被阻止

如何解决当使用工作类 gevent 运行 gunicorn 时,Python Bigquery to_dataframe 函数被阻止

当我在 gunicorn 上使用 worker-class=gevent 运行我的 Flask 应用程序时,服务器会阻塞。

  • gunicorn 命令 gunicorn 应用程序:app --workers=5 --worker-class=gevent --threads=5 --timeout=1800 --log-level=DEBUG

  • 代码

query = '...'
query_job = bigquery_client.query(query)\
query_job.to_dataframe()# to_dataframe function where block occurs
  • bigquery 库中出现块的源代码(google/cloud/bigquery/_pandas_helpers.py 文件的第 678 至 680 行)
try:
    frame = worker_queue.get(timeout=_PROGRESS_INTERVAL) # this point
    yield frame
  • Python 库版本
    • python=3.7.10
    • gunicorn=20.1.0
    • gevnet=21.1.2
    • eventlet=0.30.2
    • google-cloud-bigquery=2.20.0
    • google-cloud-bigquery-storage=2.4.0
    • google-cloud-core=1.6.0
    • pyarrow=4.0.0

当 worker-class 是 eventlet 时也会发生同样的情况。当worker-class为gthread或sync时不会发生。 _pandas_helpers.py中的block是按照下面的语法执行的,是不是线程相关的问题?

with concurrent.futures.ThreadPoolExecutor(max_workers=total_streams) as pool:

为什么会发生阻塞?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。