笔记-twisted源码-import reactor解析

1.      twisted源码解析-1

twisted reactor实现原理:

第一步:

from twisted.internet import reactor

pr_type(reactor)

结果:

<twisted.internet.selectreactor.SelectReactor object at 0x0000001D5D82B748> <class 'twisted.internet.selectreactor.SelectReactor'>

1.1.    twisted.internet.reactor.py源码

github中找到相应源码:

from __future__ import division, absolute_import

import sys

del sys.modules['twisted.internet.reactor']

from twisted.internet import default

default.install()

1.1.1.   问题

奇怪的是del语句,在测试时引用又删除会报错

测试代码如下:

import sys
print(sys.modules['test_unit.m1'])

del sys.modules['test_unit.m1']

报错:

KeyError: 'test_unit.m1'

复测发现是因为从del 到import m1有一个执行过程

下面的测试正常:

temp.py

from test_unit import m1

pr_type(m1)
sys.modules['test_unit.m1'] = 5
pr_type(sys.modules['test_unit.m1'])
pr_type(m1)

test_unit.m1.py

import sys
print(sys.modules['test_unit.m1'])

del sys.modules['test_unit.m1']
sys.modules['test_unit.m1'] = 6

运行temp.py结果:

<module 'test_unit.m1' from
'E:\\python\\爬虫\\scrapy\\fangchan_pro\\fangchan_code\\test_unit\\m1.py'>

6
<class 'int'>

5
<class 'int'>

6
<class 'int'>

结果释义:

在m1.py执行完成后才会执行m1 = import()的操作

这时使用locals()可以看到m1变量:'m1': 6

1.2.   
twisted.internet.selectreactor.py源码

继续

def install():

"""Configure the twisted mainloop to be run using the
select() reactor.

"""

reactor = SelectReactor()

from twisted.internet.main import installReactor

installReactor(reactor)

1.3.   
twisted.internet.main源码

继续:

def installReactor(reactor):

"""

Install reactor C{reactor}.

@param reactor: An object that provides one or more IReactor*
interfaces.

"""

#
this stuff should be common to all reactors.

import twisted.internet

import sys

if 'twisted.internet.reactor' in sys.modules:

raise error.ReactorAlreadyInstalledError("reactor already
installed")

twisted.internet.reactor = reactor

sys.modules['twisted.internet.reactor']
= reactor

简单来说,到这里,做了两件事

  1. 将系统变量reactor = SelectReactor()
  2. sys.modules['twisted.internet.reactor'] 设为SelectReactor()

验证如下:

import sys
pr_type(reactor)
pr_type(sys.modules['twisted.internet.reactor'])

结果:

<twisted.internet.selectreactor.SelectReactor
object at 0x000000BD4943B400> <class 'twisted.internet.selectreactor.SelectReactor'>

<twisted.internet.selectreactor.SelectReactor
object at 0x000000BD4943B400> <class
'twisted.internet.selectreactor.SelectReactor'>

1.4.   
reactor.run()

reactor已经找到了,下面看一下它在运行后做什么:

res = reactor.run
pr_type(res)

结果:

<bound method _SignalReactorMixin.run of
<twisted.internet.selectreactor.SelectReactor object at
0x000000C61740B6D8>> <class 'method'>

在github中查找得到:twisted/internet/base.py

class _SignalReactorMixin(object):

def
startRunning(self, installSignalHandlers=True):

"""

PosixReactorBase的父类_SignalReactorMixin和ReactorBase都有该函数,但是_SignalReactorMixin在前,安装mro顺序的话,会先调用_SignalReactorMixin中的。

"""

self._installSignalHandlers = installSignalHandlers

ReactorBase.startRunning(self)

def run(self,
installSignalHandlers=True):

self.startRunning(installSignalHandlers=installSignalHandlers)

self.mainLoop()

def mainLoop(self):

while
self._started:

try:

while
self._started:

# Advance simulation time in delayed event

#
processors.

self.runUntilCurrent()

t2 =
self.timeout()

t =
self.running and t2

self.doIteration(t)

except:

log.msg("Unexpected error in main loop.")

log.err()

else:

log.msg('Main loop terminated.')

这里就是主循环了。

笔记-twisted源码-import reactor解析的更多相关文章

  1. IOS懒人笔记应用源码

    这个源码是懒人笔记应用源码,也是一个已经上线的apple应用商店的应用,懒人笔记iOS客户端源码,支持语音识别,即将语音转化成文本文字,所用语音识别类库为讯飞语音类库. 懒人笔记是一款为懒人设计的笔记 ...

  2. MyBatis 源码分析 - 配置文件解析过程

    * 本文速览 由于本篇文章篇幅比较大,所以这里拿出一节对本文进行快速概括.本篇文章对 MyBatis 配置文件中常用配置的解析过程进行了较为详细的介绍和分析,包括但不限于settings,typeAl ...

  3. InfluxDB源码目录结构解析

    操作系统 : CentOS7.3.1611_x64 go语言版本:1.8.3 linux/amd64 InfluxDB版本:1.1.0 influxdata主目录结构 [root@localhost ...

  4. Hadoop学习笔记(9) ——源码初窥

    Hadoop学习笔记(9) ——源码初窥 之前我们把Hadoop算是入了门,下载的源码,写了HelloWorld,简要分析了其编程要点,然后也编了个较复杂的示例.接下来其实就有两条路可走了,一条是继续 ...

  5. [转]OpenTK学习笔记(1)-源码、官网地址

    OpenTK源码下载地址:https://github.com/opentk/opentk OpenTK使用Nuget安装命令:OpenTK:Install-Package OpenTK -Versi ...

  6. Spring源码入门——DefaultBeanNameGenerator解析 转发 https://www.cnblogs.com/jason0529/p/5272265.html

    Spring源码入门——DefaultBeanNameGenerator解析   我们知道在spring中每个bean都要有一个id或者name标示每个唯一的bean,在xml中定义一个bean可以指 ...

  7. 鸿蒙内核源码分析(ELF解析篇) | 你要忘了她姐俩你就不是银 | 百篇博客分析OpenHarmony源码 | v53.02

    百篇博客系列篇.本篇为: v53.xx 鸿蒙内核源码分析(ELF解析篇) | 你要忘了她姐俩你就不是银 | 51.c.h.o 加载运行相关篇为: v51.xx 鸿蒙内核源码分析(ELF格式篇) | 应 ...

  8. v72.01 鸿蒙内核源码分析(Shell解析) | 应用窥伺内核的窗口 | 百篇博客分析OpenHarmony源码

    子曰:"苟正其身矣,于从政乎何有?不能正其身,如正人何?" <论语>:子路篇 百篇博客系列篇.本篇为: v72.xx 鸿蒙内核源码分析(Shell解析篇) | 应用窥视 ...

  9. Cognitive Graph for Multi-Hop Reading Comprehension at Scale(ACL2019) 阅读笔记与源码解析

    论文地址为:Cognitive Graph for Multi-Hop Reading Comprehension at Scale github地址:CogQA 背景 假设你手边有一个维基百科的搜索 ...

随机推荐

  1. GIT分布式代码管理系统

    1:GTI介绍及使用 环境搭建: 服务器 IP地址 主机名 角色 Centos7.5 192.168.200.113 gitserver GIT服务器 Centos7.5 192.168.200.11 ...

  2. Spring5 of WebClient(转载)

    前言 Spring5带来了新的响应式web开发框架WebFlux,同时,也引入了新的HttpClient框架WebClient.WebClient是Spring5中引入的执行 HTTP 请求的非阻塞. ...

  3. bugku 过狗一句话

    题目描述: 题目描述:                                上面的php进行格式化之后: <?php     $poc="a#s#s#e#r#t"; ...

  4. Etcd Learning Notes

    官网:https://etcd.io 官方项目地址:https://github.com/etcd-io/etcd 参考资料: https://www.hi-linux.com/posts/40915 ...

  5. Spring_002 依赖注入方式实现

    继续写我们的第一个Spring程序,这次我们使用依赖注入的方式实现程序 第一步,建立我们的Spring_002程序,并在程序中添加BookDao.java.BookDaoImpl.java.BookS ...

  6. jmeter csv 插件讲解

    1.变量名称 name,pwd 格式表示因为文本中分割默认是逗号所以变量设置也是按此格式如果想按其他格式可以在分隔符栏自定义 2.忽略首行: 有的csv读取你希望读取的数据有header如: user ...

  7. css 属性值 calc (目前只了解部分)

    移动端页面,有如下图的需求: 实现效果: 实现 css 代码: .list {/*父级*/ border: 1px solid #E9EAEA; border-radius: 2px; backgro ...

  8. openjudge(POJ)-1664 放苹果

    对于n个盘子,m个苹果,我们要么在每个盘子上都放苹果,要么至少有一个盘子不放. 一个盘子不放就是f(m,n-1),全部都放的时候苹果就变成了n-m个,但是盘子的数目是不变的,因为此时还没有产生方案数, ...

  9. 模仿虎牙App 导航栏切换

    昨天看虎牙直播,发现导航栏挺有意思,自己也做个玩玩 <view class="tab_list row"> <view class="tab_item ...

  10. ZOJ4104 Sequence in the Pocket(2019浙江省赛)

    思维~ #include<bits/stdc++.h> using namespace std; ; int a[maxn]; int b[maxn]; int N; int main ( ...