前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python twisted详解2

python twisted详解2

作者头像
用户5760343
发布2022-05-14 12:09:48
2430
发布2022-05-14 12:09:48
举报
文章被收录于专栏:sktjsktj

转载:作者:dave@http://krondo.com/slow-poetry-and-the-apocalypse/ 译者:杨晓伟(采用意译) from twisted.internet import reactor reactor.callWhenRunning(funcname) reactor.run()

!/usr/bin/python

class Countdown(object):

代码语言:javascript
复制
counter = 5

def count(self):
    if self.counter == 0:
        reactor.stop()
    else:
        print(self.counter, '...')
        self.counter -= 1
        reactor.callLater(1, self.count)

from twisted.internet import reactor

reactor.callWhenRunning(Countdown().count)

print('Start!') reactor.run() print('Stop!')

reactor.callLater(1,self.count) 1秒后,调用方法 reactor.run() reactor.callWhenRunning(xx.count) -- 工厂方法:

This is the Twisted Get Poetry Now! client, version 2.0.

NOTE: This should not be used as the basis for production code.

import datetime, optparse

from twisted.internet.protocol import Protocol, ClientFactory

def parse_args(): usage = """usage: %prog [options] [hostname]:port ... This is the Get Poetry Now! client, Twisted version 2.0. Run it like this: python get-poetry.py port1 port2 port3 ... If you are in the base directory of the twisted-intro package, you could run it like this: python twisted-client-2/get-poetry.py 10001 10002 10003 to grab poetry from servers on ports 10001, 10002, and 10003. Of course, there need to be servers listening on those ports for that to work. """

代码语言:javascript
复制
parser = optparse.OptionParser(usage)

_, addresses = parser.parse_args()

if not addresses:
    print parser.format_help()
    parser.exit()

def parse_address(addr):
    if ':' not in addr:
        host = '127.0.0.1'
        port = addr
    else:
        host, port = addr.split(':', 1)

    if not port.isdigit():
        parser.error('Ports must be integers.')

    return host, int(port)

return map(parse_address, addresses)

class PoetryProtocol(Protocol):

代码语言:javascript
复制
poem = ''
task_num = 0

def dataReceived(self, data):
    self.poem += data
    msg = 'Task %d: got %d bytes of poetry from %s'
    print  msg % (self.task_num, len(data), self.transport.getPeer())

def connectionLost(self, reason):
    self.poemReceived(self.poem)

def poemReceived(self, poem):
    self.factory.poem_finished(self.task_num, poem)

class PoetryClientFactory(ClientFactory):

代码语言:javascript
复制
task_num = 1

protocol = PoetryProtocol # tell base class what proto to build

def __init__(self, poetry_count):
    self.poetry_count = poetry_count
    self.poems = {} # task num -> poem

def buildProtocol(self, address):
    proto = ClientFactory.buildProtocol(self, address)
    proto.task_num = self.task_num
    self.task_num += 1
    return proto

def poem_finished(self, task_num=None, poem=None):
    if task_num is not None:
        self.poems[task_num] = poem

    self.poetry_count -= 1

    if self.poetry_count == 0:
        self.report()
        from twisted.internet import reactor
        reactor.stop()

def report(self):
    for i in self.poems:
        print 'Task %d: %d bytes of poetry' % (i, len(self.poems[i]))

def clientConnectionFailed(self, connector, reason):
    print 'Failed to connect to:', connector.getDestination()
    self.poem_finished()

def poetry_main(): addresses = parse_args()

代码语言:javascript
复制
start = datetime.datetime.now()

factory = PoetryClientFactory(len(addresses))

from twisted.internet import reactor

for address in addresses:
    host, port = address
    reactor.connectTCP(host, port, factory)

reactor.run()

elapsed = datetime.datetime.now() - start

print 'Got %d poems in %s' % (len(addresses), elapsed)

if name == 'main': poetry_main()

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-05-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • !/usr/bin/python
  • This is the Twisted Get Poetry Now! client, version 2.0.
  • NOTE: This should not be used as the basis for production code.
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档