我想在相同的脚本中运行一个后台工作程序,因为flask正在运行,而flask似乎被阻塞了,我想这是可以理解的。我想要一个每秒检查关键系统指标的脚本,所以我不想使用像芹菜或大型排队系统这样的东西来做这件事。
简单的代码示例
#!/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,它可以正常运行。这是可能的吗?还是我找错人了?
谢谢
发布于 2015-08-05 04:36:42
在脚本中添加下面两行:
from gevent import monkey
monkey.patch_all()在该行之前:
from flask import Flask一切都会好的
发布于 2014-08-20 10:29:25
这就是我最终如何使用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)发布于 2014-09-09 19:18:38
试着使用下面的代码:
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终止的错误,则重新生成。
https://stackoverflow.com/questions/25385646
复制相似问题