greenlet实践,将异步回调转换为顺序执行

本文通过一个具体的示例展示了如何使用Greenlet库来改变Twisted框架中的异步调用方式,使其变为同步调用。该示例通过创建一个简单的服务器应用,演示了在Twisted环境下利用Greenlet进行异步到同步转换的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

greenlet实践

作者:gashero
日期:2009-06-16

1   简介

本想依靠它实现异步转同步,试试看吧。

2   一个异步转同步的例子,使用Twisted

将Twisted中的异步改为同步了:

#! /usr/bin/env python
# -*- coding: UTF-8 -*-
# File: readcall.py
# Date: 2009-06-16
# Author: gashero

"""
测试Greenlet与Twisted合用,实现异步改同步调用
"""

import os
import sys

import greenlet
from twisted.internet import reactor,protocol
from twisted.protocols import basic
from twisted.python import log

def wait_host():
    return

class RCProtocol(basic.LineReceiver):

    def connectionMade(self):
        print 'connection made'
        self.grrc=greenlet.greenlet(self.read_chunk)
        self.grrc.switch()      #切换到处理函数read_chunk()
        print 'switched to grrc'
        return

    def connectionLost(self,reason):
        print 'connection lost'
        return

    def _dataReceived(self,data):
        return

    def lineReceived(self,line):
        print 'line Received'
        self.grrc.switch(line)
        return

    def read_chunk(self):
        while True:
            #死循环中处理每次读取数据成功
            print 'in read_chunk()'
            g_self=greenlet.getcurrent()
            chunk=g_self.parent.switch()    #切换到主循环的greenlet,等被切换回来时就返回了传递的数据了
            if 'quit' in chunk.lower():
                self.transport.write('HTTP/1.1 200 OK\r\nContent-Length:10\r\n\r\nHelloWorld')
                self.transport.loseConnection()
                break
        return

class RCFactory(protocol.ServerFactory):
    protocol=RCProtocol

def main():
    log.startLogging(sys.stdout)
    reactor.listenTCP(8090,RCFactory())
    reactor.run()
    return

if __name__=='__main__':
    main()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值