我试图了解eventlet.tpool的作用。文档说tpool.execute()允许您使用阻塞函数并在新线程中运行它。但是,tpool.execute()方法本身会阻塞,直到线程完成!那么这可能有什么用呢?如果我有一些阻塞/长时间运行的函数myfunc()并直接调用它,它将阻塞。如果我在tpool.execute(myfunc)内部调用它,则tpool.execute(myfunc)调用将阻塞。到底有什么区别?
我唯一能猜到的是,当直接调用myfunc()时,它不仅会阻止此协程,而且还会阻止其他协程运行,而调用tpool.execute()会阻止当前协程,但会以某种方式屈服,以便其他协程可以跑。是这样吗否则,我看不出tpool如何有用。
最佳答案
您自己写下了答案,我只能改写它。
关于Eventlet,Gevent,Twisted,Asyncio和其他协作式多任务库,我们使用术语“阻塞”来表示它阻塞了所有内容。未打补丁的time.sleep(1)
将阻止所有协程/绿色线程,这与OS线程语义相反,后者仅阻止调用方OS线程并允许其他OS线程继续运行。
为了区分阻塞OS线程的事物和阻塞协程/绿色线程的事物,我们使用术语“屈服”。生成函数是一种允许执行其余协程的函数,同时仅阻塞(由于Python执行语义)调用方协程。
有了强大的术语,tpool.execute()
将阻塞调用转换为产生调用。
与eventlet.spawn(tpool.execute, fun, ...)
结合使用,它甚至不会阻止调用程序协程。也许您发现这是一个有用的组合。
并且补丁总是受欢迎的。 Eventlet是一个很棒的库,因为它包含了许多伟大人物的共同努力。
关于python - eventlet池有何用处?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43947405/