首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >gevent + flask似乎阻塞

gevent + flask似乎阻塞
EN

Stack Overflow用户
提问于 2014-08-19 22:11:31
回答 3查看 2K关注 0票数 2

我想在相同的脚本中运行一个后台工作程序,因为flask正在运行,而flask似乎被阻塞了,我想这是可以理解的。我想要一个每秒检查关键系统指标的脚本,所以我不想使用像芹菜或大型排队系统这样的东西来做这件事。

简单的代码示例

代码语言:javascript
复制
#!/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)

我的输出看起来像这样

代码语言:javascript
复制
$ ./so.py
do something: 1
do something: 2
 * Running on http://127.0.0.1:5000/

如果我删除app.run的theads.append,它可以正常运行。这是可能的吗?还是我找错人了?

谢谢

EN

回答 3

Stack Overflow用户

发布于 2015-08-05 04:36:42

在脚本中添加下面两行:

代码语言:javascript
复制
from gevent import monkey
monkey.patch_all()

在该行之前:

代码语言:javascript
复制
from flask import Flask

一切都会好的

票数 2
EN

Stack Overflow用户

发布于 2014-08-20 10:29:25

这就是我最终如何使用apscheduler v2来处理这个问题

代码语言:javascript
复制
#!/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)
票数 1
EN

Stack Overflow用户

发布于 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终止的错误,则重新生成。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25385646

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档