greenlet.error:无法切换到其他线程

2024-10-01 07:50:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个Flask应用程序,在尝试将Flask与faust集成时出现此错误

app.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

main.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

另一个控制器

@api_blue_print.route('/v1/analyse', methods=['POST'])
def analyse():
    analyse_with_historic_data.send(value=[somedata])
    return jsonify({'message': 'Enqueued'}), 201

使用_历史_data.py分析_

@app.agent(analysis_topic)
async def analyse_with_historic_data(self, stream):
    async for op in stream:
        entity_log = EntityLog.where('id', op.entity_log_id).first()

错误跟踪:

Traceback (most recent call last):
  File "/Users/sahilpaudel/.pyenv/versions/3.6.5/lib/python3.6/site-packages/eventlet/hubs/hub.py", line 461, in fire_timers
    timer()
  File "/Users/sahilpaudel/.pyenv/versions/3.6.5/lib/python3.6/site-packages/eventlet/hubs/timer.py", line 59, in __call__
    cb(*args, **kw)
  File "/Users/sahilpaudel/.pyenv/versions/3.6.5/lib/python3.6/site-packages/eventlet/semaphore.py", line 147, in _do_acquire
    waiter.switch()
greenlet.error: cannot switch to a different thread
Traceback (most recent call last):
  File "/Users/sahilpaudel/.pyenv/versions/3.6.5/lib/python3.6/site-packages/eventlet/hubs/hub.py", line 461, in fire_timers
    timer()
  File "/Users/sahilpaudel/.pyenv/versions/3.6.5/lib/python3.6/site-packages/eventlet/hubs/timer.py", line 59, in __call__
    cb(*args, **kw)
  File "/Users/sahilpaudel/.pyenv/versions/3.6.5/lib/python3.6/site-packages/eventlet/semaphore.py", line 147, in _do_acquire
    waiter.switch()
greenlet.error: cannot switch to a different thread
Traceback (most recent call last):
  File "/Users/sahilpaudel/.pyenv/versions/3.6.5/lib/python3.6/site-packages/eventlet/queue.py", line 118, in switch
    self.greenlet.switch(value)
greenlet.error: cannot switch to a different thread
^CError in atexit._run_exitfuncs:
Traceback (most recent call last):
  File "/Users/sahilpaudel/.pyenv/versions/3.6.5/lib/python3.6/threading.py", line 551, in wait
    signaled = self._cond.wait(timeout)
  File "/Users/sahilpaudel/.pyenv/versions/3.6.5/lib/python3.6/threading.py", line 299, in wait
    gotit = waiter.acquire(True, timeout)
  File "/Users/sahilpaudel/.pyenv/versions/3.6.5/lib/python3.6/site-packages/eventlet/semaphore.py", line 107, in acquire
    hubs.get_hub().switch()
  File "/Users/sahilpaudel/.pyenv/versions/3.6.5/lib/python3.6/site-packages/eventlet/hubs/hub.py", line 298, in switch
    return self.greenlet.switch()
  File "/Users/sahilpaudel/.pyenv/versions/3.6.5/lib/python3.6/site-packages/eventlet/hubs/hub.py", line 350, in run
    self.wait(sleep_time)
  File "/Users/sahilpaudel/.pyenv/versions/3.6.5/lib/python3.6/site-packages/eventlet/hubs/kqueue.py", line 96, in wait
    time.sleep(seconds)

我试图通过monkey.patch_解决这个问题,但也没有成功,因为它给出了另一个stacktrace,锁不能被释放


Tags: inpyimportapppyenvlibpackagesline