当前位置: 首页 > 面试题库 >

扭曲:使代码无阻塞

巫马自明
2023-03-14
问题内容

我对如何在python /
twisted中编写异步代码感到困惑。假设(出于参数考虑)我正在向世界公开一个函数,该函数将接受一个数字,如果它是质数/非质数,则返回True /
False,因此它看起来像这样:

def IsPrime(numberin):
    for n in range(2,numberin):
        if numberin % n == 0: return(False)
    return(True)

(只是为了说明)。

现在,假设有一个Web服务器需要根据提交的值调用IsPrime。对于大型服务器,这将需要很长时间numberin

如果在此期间另一个用户要求小数的素数,是否有一种方法可以使用react /
deferreds架构异步运行两个函数调用,以便在长计算的结果之前返回短计算的结果?

我知道如果IsPrime功能来自其他Web服务器,我的网络服务器将对它进行延迟的getPage,该怎么办,但是如果它只是本地函数怎么办?

即,Twisted可以在两次调用IsPrime的调用之间以某种方式分时,还是需要显式调用新线程?

或者,是否需要将IsPrime循环分成多个较小的循环,以便将控制迅速传递回反应堆?

或者是其他东西?


问题答案:

我认为您目前的理解基本上是正确的。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



 类似资料:
  • 问题内容: 什么是Twisted最接近的Java替代方案? 问题答案: 与斯蒂芬(Stephane)一样,我建议您看一下Mina。它是异步网络IO的框架。它建立在前面提到的NIO之上,并且IMO隐藏了与Selectors,Channels等有关的一些复杂性。我已经使用Mina进行了几个项目,其效果相当不错,但是请注意,我发现文档有些薄弱。再有,就像Stephane提到的那样,它并没有对太多协议的现

  • 问题内容: 谁能推荐一些简单的代码来使用Twisted设置简单的JSON RPC客户端和服务器? 我找到了txJSON-RPC,但我想知道是否有人对使用这些anc有一定的经验可以推荐一些东西。 问题答案: txJSONRPC很棒。我使用它,并且有效。我建议您尝试一下。 客户: 作为奖励,我将保留一些替代方案:放大器。 http://amp-protocol.net

  • 问题内容: 因此,我研究了一些事情,包括使用python和Twisted框架编写HTTP代理。 本质上,像其他一些问题一样,我希望能够修改将发送回浏览器的数据。也就是说,浏览器请求资源,代理将获取资源。在资源返回浏览器之前,我希望能够修改ANY(HTTP标头和内容)内容。 这是我最初发现的(需要帮助编写扭曲的代理)。我尝试了一下,但对我没有用。我还发现了该功能(Python Twisted代理-

  • 问题内容: websockets有趣的部分是从服务器向浏览器发送本质上未经请求的内容,对吗? 好吧,我正在使用GregorMüllegger的django-websocket。使Websockets在Django中工作确实是一个很棒的早期尝试。 我完成了“ helloworld”。它的工作方式是:当请求是websocket时,会将对象websocket附加到请求对象。因此,在解释websocket

  • 我想像这样扭曲图像: 2013年4月8日新增:我使用了此代码,但无法正常工作:

  • 问题内容: 我正在尝试开始学习如何创建套接字服务器。我想添加一些有用的功能(例如auth,也许还有其他一些功能)。也许有人可以给我指出一个很好的教程,这将帮助我入门(+也许还有其他一些想法) 问题答案: 看这里:60秒内扭曲的网。这是一组博客文章,逐步描述了如何使用Twisted做很多常见的事情,所有这些都是由Twisted的最大贡献者Jean- Paul Calderone撰写的。这确实是您应该