Twisted可能是Python中支持的异步编程的最古老的第三方库之一。许多开发者已使用它开发了各种应用程序。它支持许多网络协议,并可用于许多不同类型的网络编程。实际上,asyncio受Twisted的启发很大。几名专业的Twisted开发人员的也参加到了asyncio的构建工作中。不久,将会有一个基于asyncio的Twisted版本。

过渡

下表显示了Twisted和asyncio中一些的类似概念。

Twisted asyncio
Deferred asyncio.Future
deferToThread(func) loop.run_in_executor(None, func)
@inlineCallbacks async def
reactor.run() loop.run_forever()

示例

这个小例子显示了两个等效的程序,一个在Twisted中实现,一个在asyncio中实现。

  • 基于 deferred 的 Twisted 例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
from twisted.internet import defer
from twisted.internet import reactor


def multiply(x):
result = x * 2
d = defer.Deferred()
reactor.callLater(1.0, d.callback,
result)
return d


def step1(x):
return multiply(x)


def step2(result):
print("result: %s" % result)

reactor.stop()


d = defer.Deferred()
d.addCallback(step1)
d.addCallback(step2)
d.callback(5)

reactor.run()
  • 基于asyncio的简单例子
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import asyncio


async def multiply(x):
result = x * 2
await asyncio.sleep(1)
return result


async def steps(x):
result = await multiply(x)
print("result: %s" % result)


loop = asyncio.get_event_loop()
coro = steps(5)
loop.run_until_complete(coro)
loop.close()

参考资料

https://asyncio.readthedocs.io/en/latest/twisted.html