前言
Twisted是以event为驱动的异步框架,reactor为它的核心组件,全局循环,有event会触发,这样主程序不用阻塞去处理某一条连接,达到I/O异步的效果。此外Twisted支持许多常见的传输及应用层协议,包括TCP、UDP、SSL/TLS、HTTP、IMAP、SSH、IRC以及FTP,内置了很多类型的protocol,factory,可以根据需求做不同选择
概述
在twsited中无论多复杂的业务都是通过factory和protocol去实现的,factory负责管理连接,protocol负责处理数据。
TCP Server实现
# -*- coding:utf-8 -*-
import functools
import time
import logging
from twisted.internet.protocol import Protocol, ServerFactory
from twisted.internet import reactor
from twisted.internet.threads import deferToThread
class EchoProtocol(Protocol):
def __init__(self):
pass
def connectionMade(self):
print "Connection made:%s" % self.transport.getPeer()
def connectionLost(self, reason):
print "Connection %s losted" % str(self.transport.client) + str(reason)
def dataReceived(self, data):
print "Received Data:%s" % data
if data:
self.transport.write(data)
# 这里把耗时的IO任务异步处理,这样不会阻塞主程序
func = functools.partial(self.do_something,'params')
# 回调函数
deferToThread(func).addBoth(lambda x: x, '0')
self.transport.loseConnection()
def do_something(self, *args, **kwargs):
pass
class EchoFactory(ServerFactory):
def __init__(self):
# 将protocol类型初始化
self.protocol = EchoProtocol
# 将factory当做protocol属性可以共享factory方法,例如日志模块等
self.protocol.factory = self
self.set_log()
def startFactory(self):
print "Start Processor Factory at %s" % time.strftime("%Y%m%d%H%M%S")
def stopFactory(self):
print "Stop Processor Factory at %s" % time.strftime("%Y%m%d%H%M%S")
def set_log(self):
pass
reactor.listenTCP(8008,EchoFactory())
reactor.run()