事件池(eventlet tpool)有什么用处?

3
我正在尝试理解eventlet.tpool的用途。文档称,tpool.execute()可以让你将阻塞函数放在新线程中运行。然而,tpool.execute()方法本身会阻塞直到线程完成!那么这有什么用呢?如果我有一些阻塞/长时间运行的函数myfunc()并直接调用它,它会阻塞。如果我在tpool.execute(myfunc)中调用它,那么tpool.execute(myfunc)调用也会阻塞。这两者有什么区别呢?
我唯一能猜测的是,当直接调用myfunc()时,它不仅会阻塞该协程,还会阻止其他协程运行,而调用tpool.execute()将阻塞当前协程但以某种方式进行了yield,以便其他协程可以运行。是这样吗?否则我不知道tpool有什么用处。
1个回答

6
关于Eventlet、Gevent、Twisted、Asyncio和其他协作多任务库,我们使用术语“阻塞”来表示它会阻塞所有内容。未打补丁的time.sleep(1)将阻塞所有协程/绿色线程,而与操作系统线程语义相反,后者仅会阻塞调用者操作系统线程并允许其他操作系统线程继续运行。
为了区分阻塞操作系统线程和阻塞协程/绿色线程的事物,我们使用术语“yielding”。一个yielding函数是一个允许执行其余协程的函数,同时(由于Python执行语义)只阻塞调用者协程。
有了这个强大的术语,tpool.execute()将阻塞调用转换为yielding
eventlet.spawn(tpool.execute, fun, ...)结合使用,即使是调用者协程也不会被阻塞。也许您会发现这是一个有用的组合。
欢迎随时提供补丁。Eventlet是一个伟大的库,因为它包含了许多优秀人才的共同努力。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接