Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python eventlet tpool如何有用?_Python_Multithreading_Coroutine_Eventlet - Fatal编程技术网

Python eventlet tpool如何有用?

Python eventlet tpool如何有用?,python,multithreading,coroutine,eventlet,Python,Multithreading,Coroutine,Eventlet,我试图了解eventlet.tpool的用途。文档中说,tpool.execute()允许您使用阻塞函数并在新线程中运行它。但是,tpool.execute()方法本身会阻塞,直到线程完成!那么这怎么可能有用呢?如果我有一些阻塞/长时间运行的函数myfunc()并直接调用它,它将阻塞。如果我在tpool.execute(myfunc)内部调用它,那么tpool.execute(myfunc)调用将被阻塞。到底有什么区别 我唯一能猜到的是,当直接调用myfunc()时,它不仅会阻止此协同路由,还会

我试图了解eventlet.tpool的用途。文档中说,tpool.execute()允许您使用阻塞函数并在新线程中运行它。但是,tpool.execute()方法本身会阻塞,直到线程完成!那么这怎么可能有用呢?如果我有一些阻塞/长时间运行的函数myfunc()并直接调用它,它将阻塞。如果我在tpool.execute(myfunc)内部调用它,那么tpool.execute(myfunc)调用将被阻塞。到底有什么区别


我唯一能猜到的是,当直接调用myfunc()时,它不仅会阻止此协同路由,还会阻止其他协同路由运行,而调用tpool.execute()会阻止当前协同路由,但会以某种方式产生,以便其他协同路由可以运行。是这样吗?否则我看不出tpool有什么用处。

答案是你自己写的,我只能重新措辞

关于Eventlet、Gevent、Twisted、Asyncio和其他协作多任务库,我们使用术语“阻塞”来表示它阻塞了所有东西。Unpatched
time.sleep(1)
将阻止所有协同程序/绿色线程,而操作系统线程语义仅阻止调用方操作系统线程并允许其他操作系统线程继续

为了区分阻止OS线程的东西和阻止协同程序/绿色线程的东西,我们使用术语“屈服”。屈服函数是一个允许执行其余协同路由的函数,同时(由于Python执行语义)只阻塞调用方协同路由

借助这一强大的术语,
tpool.execute()
将阻塞调用转化为产生调用

结合
eventlet.spawn(tpool.execute,fun,…)
它甚至不会阻止调用方协同程序。也许你会发现这是一个有用的组合

而且补丁总是受欢迎的。Eventlet是一个伟大的库,因为它包含了许多伟大人物的共同努力