扭曲:使代码无阻塞

扭曲:使代码无阻塞,第1张

扭曲:使代码无阻塞

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

isPrime
在完成第一次执行之前,无法再次执行。

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

通过将事物分成小块并使事件处理程序在这些块之间运行,可以使它们“异步”。如果转换不会使代码难以理解和维护,则有时这是一种有用的方法。Twisted提供了一个帮助安排这些工作块的助手

cooperate
。使用此帮助程序是有益的,因为它可以根据所有不同的工作源来制定计划决策,并确保为服务事件源留有时间,而不会产生明显的额外延迟(换句话说,您向其中添加的工作越多)
,则每项工作将花费的时间更少,因此反应堆可以继续完成其工作)。

Twisted的确提供了几种用于处理线程和进程的API。如果不清楚如何将工作分解为多个部分,这些方法将很有用。您可以用来

deferToThread
在线程池中运行(线程安全!)函数。方便地,此API返回a
Deferred
,最终将使用该函数的返回值(
Failure
如果该函数引发异常,则返回a
)。这些Deferred看起来与其他任何Deerred一样,就使用它们的代码而言,它也很可能从这样的调用中返回
getPage
-该函数不使用额外的线程,仅使用非阻塞I
/ O和事件处理程序。

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

reactor.spawnProcess
。还有安瓿,将管理过程池为你提供了一个模拟的封装
deferToThread
为过程,
deferToAMPProcess



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5630495.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-15

发表评论

登录后才能评论

评论列表(0条)

保存