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或线程,这将有所帮助。