带有eventlet的gunicorn按顺序运行线程

时间:2018-07-16 13:40:27

标签: python multithreading flask gunicorn eventlet

from flask import Flask
app = Flask(__name__)


import threading


class SThread(threading.Thread):

    def __init__(self):

        threading.Thread.__init__(self)


    def run(self):

        for i in range(1, 1000):
            print 0


t = SThread()
t.start()


for i in range(1, 1000):
    print 1 

t.join()

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

当像这样gunicorn run:app -b 0.0.0.0:8000启动服务器时,您会看到所有0和1都是随机的,主线程和子线程正在并行运行。

但是,当您使用gunicorn --worker-class eventlet run:app -b 0.0.0.0:8000运行同一段代码时,您首先会看到所有的数字都是0,然后是全部的1。这意味着主线程和子线程没有并行运行。

这是预期的行为吗?
以及如何使用eventlet和利用线程行为?

已修改:::

基于建议,我正在尝试执行类似的操作以实现诸如随机行为之类的线程并加入这些多个执行流。 但是它仅以顺序方式运行。

    from flask import Flask
    app = Flask(__name__)


    import eventlet


    def background(): 
        for i in range(1, 10000):
            print 0
        return 42

    def callback(gt, *args, **kwargs): 
        result = gt.wait() 
        print("[cb] %s" % result) 


    greenth = eventlet.spawn(background) 

    for i in range(1, 10000):
        print 1 

    greenth.link(callback)

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

1 个答案:

答案 0 :(得分:0)

此“紧密循环”不会给运行其他绿色线程的机会。

    for i in range(1, 1000):
        print 0

Eventlet / gevent / asyncio /其他类似技术提供了协作多线程。因此,您必须编写协作的代码。您可能会发现此答案很有用https://stackoverflow.com/a/14227272/73957

在更多的“真实代码”中,您将执行一些网络IO或等待同步,这将隐式运行其他绿色线程。否则,您需要明确地控制其他绿色线程:eventlet.sleep()

不需要的代码审查:如果您决定使用eventlet或线程中的一种,这将有所帮助。