gevent + flask似乎阻止了

时间:2014-08-19 14:11:31

标签: python flask gevent

我想在烧瓶正在运行的同一个脚本中运行后台工作器,烧瓶似乎阻塞,我猜这是可以理解的。我几乎想要一个脚本每秒检查关键系统指标,所以我不想使用芹菜或大排队系统这样做。

简单的代码示例

#!/usr/bin/env python

import gevent
from flask import Flask


class Monitor:
    def __init__(self, opts):
        self.opts = opts

    def run(self):
        print "do something: %i" % self.opts

        gevent.sleep(1)

        self.run()


app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello World!'

if __name__ == '__main__':
    threads = []

    for mon in [1,2]:
        monitor = Monitor(mon)
        threads.append(gevent.spawn(monitor.run))


    threads.append(gevent.spawn(app.run))

    gevent.joinall(threads)

我的输出看起来像

$ ./so.py
do something: 1
do something: 2
 * Running on http://127.0.0.1:5000/

如果我删除app.run的theads.append,它运行正常。这是可能的,还是我在咆哮错误的树?

由于

3 个答案:

答案 0 :(得分:2)

在你的脚本中添加两行:

from gevent import monkey
monkey.patch_all()

行之前:

from flask import Flask

一切都好吗

答案 1 :(得分:1)

这就是我最终使用apscheduler v2

处理问题的方法
#!/usr/bin/env python

import gevent
import time
from flask import Flask
from apscheduler.scheduler import Scheduler

sched = Scheduler()
sched.start()

class Monitor:
    def __init__(self, opts):
        self.opts = opts

    def run(self):
        @sched.interval_schedule(seconds=1)
        def handle_run():
            print "do something: %i" % self.opts


app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello World!'

if __name__ == '__main__':

    for mon in [1,2]:
        monitor = Monitor(mon)
        monitor.run()

    app.run(threaded=True)

答案 2 :(得分:0)

尝试使用以下内容:

class Monitor: def init(self, opts): self.opts = opts def run(self): While True: print "do something: %i" % self.opts gevent.sleep(1)

然后也许不会加入,因为在做其他事情之前,你似乎并不想等待他们完成。

你可能还需要在while循环中放置一个try / except语句,如果有一个错误杀死了greenlet,则重新生成。