我想在烧瓶正在运行的同一个脚本中运行后台工作器,烧瓶似乎阻塞,我猜这是可以理解的。我几乎想要一个脚本每秒检查关键系统指标,所以我不想使用芹菜或大排队系统这样做。
简单的代码示例
#!/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,它运行正常。这是可能的,还是我在咆哮错误的树?
由于
答案 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,则重新生成。