您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

扭曲:使代码无阻塞

扭曲:使代码无阻塞

我认为您目前的理解基本上是正确的。Twisted只是一个Python库,您编写使用该Python库的Python代码可以正常执行,就像您期望的Python代码一样:如果您只有一个线程(和一个进程),那么一次只发生一件事。Twisted提供的API几乎不会创建新的线程或进程,因此在正常情况下,您的代码将按顺序运行;isPrime在完成第一次执行之前,无法再次执行。

仍仅考虑单个线程(和单个进程),Twisted的所有“并发性”或“并行性”来自以下事实:Twisted提供了以下工具来代替阻塞网络I / O(和某些其他阻塞操作):以非阻塞方式执行操作。这样一来,您的程序就可以继续执行其他工作,否则它可能会卡住,无法等待阻塞的I / O操作(例如,读取或写入套接字)完成。

通过将事物分成小块并使事件处理程序在这些块之间运行,可以使它们“异步”。如果转换不会使代码难以理解和维护,则有时这是一种有用的方法。Twisted提供了一个帮助安排这些工作块的助手cooperate。使用此帮助程序是有益的,因为它可以根据所有不同的工作源来制定计划决策,并确保为服务事件源留有时间,而不会产生明显的额外延迟(换句话说,您向其中添加的工作越多) ,则每项工作将花费的时间更少,因此反应堆可以继续完成其工作)。

Twisted的确提供了几种用于处理线程和进程的API。如果不清楚如何将工作分解为多个部分,这些方法将很有用。您可以用来deferToThread在线程池中运行(线程安全!)函数。方便地,此API返回aDeferred,最终将使用该函数的返回值(Failure如果该函数引发异常,则返回a )。这些Deferred看起来与其他任何Deerred一样,就使用它们的代码而言,它也很可能从这样的调用中返回getPage-该函数不使用额外的线程,仅使用非阻塞I / O和事件处理程序。

由于Python不太适合在单个进程中运行多个cpu绑定线程,因此Twisted还提供了一个非阻塞API来启动子进程并与子进程通信。您可以将计算工作分流到此类进程,以利用更多的cpu或内核,而不必担心GIL会使您的速度降低,而分块策略和线程方法都无法提供这种功能。用于处理此类过程的最低级别的API是reactor.spawnProcess。还有安瓿,将管理过程池为你提供了一个模拟的封装deferToThread为过程,deferToAMPProcess

其他 2022/1/1 18:37:34 有458人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶