twisted笔记三:當Deferred遇上Thread(转载)

2023-05-16

       Deferred不會自動實現將阻塞過程轉為非阻塞過程,雖然它已經有那樣的機制但還是要你去多走一步。要將阻塞過程轉為真正的非阻塞過程,那麼只有借用線程。但至於線程調用你不用太擔心,twisted已為你準備好一個方便的用法。就是將Deferred綁在Thread上,這樣就有了deferToThread,味道不比牛奶加巧克力差。
        deferToThread在twisted文檔的說明,洋墨水喝得比較少,就不照字面翻譯了。大概意思是將函數f放在線程裡並作為Deferred返回,args和kwargs是函數f的參數。也就是使用deferToThread返回的是一個帶線程的Deferred,並自動使用callback調用指定的函數f。相當於在線程中運行下面的代碼
    d=defer.Deferred().addCallback(f)
    d.callback(result)
 

def deferToThread(f, *args, **kwargs): (source)

Run a function in a thread and return the result as a Deferred.

ParametersfThe function to call.
*argspositional arguments to pass to f.
**kwargskeyword arguments to pass to f.
Returns

A Deferred which fires a callback with the result of f, or an errback with a twisted.python.failure.Failure if f throws an exception.

#!/usr/bin/env python
#coding=utf-8

from twisted.internet import protocol,reactor,defer
from twisted.internet.threads import deferToThread
from twisted.protocols import basic
import time,sys
syscode='big5'

class muProtocol(basic.LineReceiver):

    def connectionMade(self):
        print 'connectionMade'
        self.factory.clients[self]={}
        self.factory.clients[self]['isblankly']=True

    def lineReceived(self,data):
        self.factory.clients[self]['isblankly']=False
        self.transport.write(self.factory.getSomething(data))
        if data=='q':
            self.transport.loseConnection()
        self.factory.kungfuTea(data)

class muFactory(protocol.ServerFactory):
    protocol=muProtocol

    def __init__(self):
        reactor.callLater(1,self.timeout)
        self.clients={}

    def timeout(self):
        sys.stdout.write('.')
        sys.stdout.flush()
        reactor.callLater(1,self.timeout)

    def getSomething(self,data):
        return '\n\rServer say: %s\n\r' % data

    def goodTaste(self,data):
        print u'%s:耍下太極,仲加埋嘆下功夫茶,都有排等羅。'.encode(
            syscode,'replace') % data
        time.sleep(10)
        print u'%s,打完收功。'.encode(syscode,'replace') % data
        return data

    def wrongTaste(self,data):
        print u'%s:好味道盡在kung fu tea。'.encode(syscode,'replace') % data

    def kungfuTea(self,data):
        return deferToThread(self.goodTaste,data
            ).addBoth(self.wrongTaste)

reactor.listenTCP(20190,muFactory())
reactor.run()

     分析下上面的代碼。
    當接收到數據後調用self.factory.kungfuTea(data)
    def lineReceived(self,data):
        self.factory.kungfuTea(data)
    工廠中的kungfuTea只是使用deferToThread將真正處理數據的過程轉goodTaste為一個線程的Deferred,剩下的東西就和Deferred操作無異。

    牛奶加巧克力不錯,老板再來一杯!

传送门:
[twisted笔记一:Deferred笔记(搬运)](https://blog.csdn.net/huangzyi/article/details/112559998)
[twisted笔记二:twisted的那三板斧(转载)](https://blog.csdn.net/huangzyi/article/details/112561779)
[twisted笔记三:當Deferred遇上Thread(转载)](https://blog.csdn.net/huangzyi/article/details/112563308)

转自:https://sites.google.com/site/mypynotes/twisted-1/defertothread

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

twisted笔记三:當Deferred遇上Thread(转载) 的相关文章

随机推荐

  • Python实现排序

    在Python中可以使用提供的sort排序法对list实现排序 Python提供两种内置排序的函数分别是sort 和sorted xff0c 这两种函数用法差别在于sort 会直接修改原始的list进行排序 xff0c sorted 可迭代
  • Python排序进阶版:根据一个列表的顺序对其他列表进行排序

    在Python中如果需要根据列表A对列表B进行排序的问题时有以下2种方法 xff1a 方法1 xff1a 根据列表B中每个元素的下标来获取列表A中对应位置的元素 xff0c 将其作为排序依据即可 a span class token ope
  • 基于MATLAB GUI的系统设计(四)

    接下来学习的是关于图像处理方面的知识 实例一 xff1a 对图像进行灰度处理 直方图均衡化处理 二值处理以及用Canny算子对图像进行边缘检测 第一步 xff1a GUIDE画界面 第二步 xff1a 编辑代码 function varar
  • HashMap的工作原理(图文+例子)详解,绝对简单通俗易懂

    目录 什么是HashMap xff1f HashMap的内部结构 内部结构之数组 内部结构之链表 Put方法与Get方法原理 JDK1 7月JDK1 8中HashMap的区别 什么是HashMap xff1f 基于哈希表的 Map 接口的实
  • vnc序列号

    5D7L8 ZQXSA 2L5D4 4UFB4 PWDLA 8KNFU MZZHE WA449 2SLLH 48Q7A
  • A星(A*、A Star)路径规划算法详解(附MATLAB代码)

    首先看看运行效果 xff0c 分别有三种模式 xff0c 代码运行前需要通过鼠标点击设置起点和终点 第一种模式直接输出最短路径 第二种模式输出最短路径的生成过程 第三种模式输出最短路径的生成过程和详细探索的过程 代码获取 gitee链接 x
  • ubuntu系统支持GIGABYTE X570 I AORUS PRO WIFI主板温度及风扇转速检测

    原文链接 xff1a How to fix bugs in Ubuntu 20 04 LTS after installation 43 all necessary programs ITCooky Recipes Not getting
  • 计算机启动过程(windows XP 系统)

    计算机启动过程 xff08 windows XP 系统 xff09 共五步 1 预引导 Pre Boot 阶段 xff1b 2 引导阶段 xff1b 3 加载内核阶段 xff1b 4 初始化内核阶段 xff1b 5 登陆 第一个阶段 首先
  • 2006年6月21日

    最近住了一段时间医院 xff0c 在那里除了休息就是休息 xff0c 回来都一周了 xff0c 我都没有适应了学校的生活 xff0c 一天除了睡觉就是看世界杯 哈哈 xff0c 得要有个好心态 看一点东西就算一点 xff0c 写出来 xff
  • 2006 年6月23日

    我为网上下载的一个TDI的源代码写了一个source文件 xff0c 可是编译时却出现了如下问题 can 39 t open include file 34 netpnp h 34 以及 can 39 t open input file 3
  • Linux搭建Web服务器(三)——服务器编程基本框架以及事件处理模式

    目录 0x01 服务器编程基本框架 0x02 两种高效的事件处理模式 Reactor 模式 Proactor 模式 模拟Proactor 模式 0x01 服务器编程基本框架 虽然服务器程序的种类繁多 xff0c 但是其基本框架都是一样的 x
  • 解决docker容器IP不固定问题

    创建了两个容器 xff0c 做好mysql的主从配置了 xff0c 重启docker容器之后 xff0c 发现容器的ip地址变了 xff0c 这就尴尬了 xff0c 首先了解到了docker默认采用 bridge 连接 xff0c 启动容器
  • VSCode 基本使用

    一 VSCode 界面功能介绍 1 Git History xff0c 相当于 git log 3 打开上一提交版本的更改记录 4 显示提交注释 5 向右分屏 6 直接定位到第几行 7 解析当前文件的语言 8 切换项目 xff08 基于 P
  • keras中实现简单的反卷积

    我这里将反卷积分为两个操作 xff0c 一个是UpSampling2D xff0c 用上采样将原始图片扩大 xff0c 然后用Conv2D 这个函数进行卷积操作 xff0c 就可以完成简单的反卷积 xff1a UpSampling2D xf
  • STM32学习笔记:蜂鸣器实验

    STM32学习笔记 xff1a 蜂鸣器实验 蜂鸣器实现原理和led点亮大同小异 xff0c 所以就不重新编写了 一 所使用的函数 span class token number 1 span 时钟使能函数 span class token
  • centos6/7通用查看系统版本

    方法一 可以用lsb release a来查看系统版本 root 64 centos6 lsb release a LSB Version base 4 0 amd64 base 4 0 noarch core 4 0 amd64 core
  • 欢迎使用CSDN-markdown编辑器

    ADB操作命令及其详解 adb是什么 xff1a adb的全称为Android Debug Bridge xff0c 就是起到调试桥的作用 通过adb我们可以在Eclipse中方面通过DDMS来调试android程序 xff0c 说白了就是
  • 私有云上创建与配置虚拟机

    目录 一 登录私有云 二 创建网络 新建路由等 xff08 一 xff09 创建网络 hy 二 新建路由 xff08 三 xff09 添加接口 xff08 四 xff09 查看网络拓扑 xff08 五 xff09 添加端口 三 创建实例 x
  • 远程桌面打开mayavi,基于VirtualGL + Turbovnc

    实现内容 xff1a 远程桌面打开mayavi xff0c 基于VirtualGL 43 Turbovnc 参考链接 xff1a 链接1 下面是复制过来的内容 xff0c 附加上我的注释 xff1a Setup VirtualGL and
  • twisted笔记三:當Deferred遇上Thread(转载)

    Deferred不會自動實現將阻塞過程轉為非阻塞過程 xff0c 雖然它已經有那樣的機制但還是要你去多走一步 要將阻塞過程轉為真正的非阻塞過程 xff0c 那麼只有借用線程 但至於線程調用你不用太擔心 xff0c twisted已為你準備好