带有eventlet的gunicorn以顺序方式运行线程


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!'

这个"紧密循环"不给运行其他绿色线程的机会。

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

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

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

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

最新更新