python重新加载文件_Python的重新加载知识点总结
简述Python的重新加载
为防止两个模块互相导入的问题,Python默认所有的模块都只导入一次,如果需要重新导入模块,
Python2.7可以直接用reload(),Python3可以用下面几种方法:
方法一:基本方法
from imp import reload
reload(module)
方法二:按照套路,可以这样
import imp
imp.reload(module)
方法三:看看imp.py,有发现,所以还可以这样
import importlib
importlib.reload(module)
方法四:根据天理,当然也可以这样
from importlib import reload
reload(module)
以上就是简述Python的重新加载的详细内容,更多请关注码农之家其它相关文章!
Python重新加载模块的实现方法
importlib 模块的作用
模块,是一个一个单独的py文件 包,里面包含多个模块(py文件)
动态导入模块,这样就不用写那么多的import代码, 典型的例子: 自动同步服务,每个网站都有一个py文件。主进程里收到同步任务,根据名称来动态导入对应的py文件,这样就不用写那么多的import代码。(有点类似java的工厂方法)
但是,importlib并不能解决我在线修改py源码,再不重启进程的情况下,使修改生效。 这种情况,可以使用reload()
reload方法
为防止两个模块互相导入的问题,Python默认所有的模块都只导入一次,如果需要重新导入模块, Python2.7可以直接用reload(),Python3可以用下面几种方法:
方法一:基本方法 from imp import reload reload(module)
方法二:按照套路,可以这样 import imp imp.reload(module)
方法三:看看imp.py,有发现,所以还可以这样 import importlib importlib.reload(module)
方法四:根据天理,当然也可以这样 from importlib import reload reload(module)
在多进程的 程序中,一个进程的reload是无法影响另一个进程的
例子:
# 在主进程中启动多进程
def begin():
""" 启动多进程 """
plist = []
for i in xrange(Num_process):
p = Process(target=pre_run)
p.start()
plist.append(p)
# 此进程监听redis消息,收到消息,即执行reload方法
p = Process(target=reload_spider)
p.start()
plist.append(p)
for p in plist:
p.join()
# 监听redis,执行reload方法
def reload_spider():
""" 监听文件变化,自动reload """
rconn = redis.Redis(host=settings.REDIS_HOST, port=settings.REDIS_PORT, db=settings.REDIS_DB, password=settings.REDIS_PW)
while True:
try:
key = 'reload-spider'
value = rconn.get(key)
print value
if value == '1':
crawler_module = importlib.import_module('crawlers.%s' % 'temp'.lower())
reload(crawler_module)
crawlerClass = getattr(crawler_module, 'temp'.upper())
print 'reload_spider 中的class: %s' % (crawlerClass.name)
# rconn.delete(key)
except Exception, e:
pass
time.sleep(3)
另一个进程打印py文件里面一个变量
crawler = get_crawler_from_factory(mq_service, message)
print crawler.name
结果发现,一个进程中进行了reload,并不能改变另外一个进程中的变量。那么在同一个进程中呢...
同一进程中,多线程,任一线程进行了reload操作,其他线程均受影响
def pre_run():
t = threading.Thread(target=reload_spider, name='LoopThread')
t.start()
# t.join()
""" 在每个进程里面再使用多线程 """
pool = ThreadPool(Num_Thread)
# 初始化mq通道
mq_service = RabbitMqService()
def callback(ch, method, properties, body):
# 消息确认
mq_service.input_channel.basic_ack(delivery_tag=method.delivery_tag)
# 获取当前线程的名字
current_process_name = multiprocessing.current_process().name
logger.debug('当前进程名称:%s - pid: %s' % (current_process_name, os.getpid()))
logger.debug('进程 %s,收到消息: %s' % (current_process_name, body))
# 收到任务消息,丢给线程池处理
pool.apply_async(run, (properties, body, mq_service))
# 开始监听入口通道
mq_service.receive(callback)
reload_spider中监听redi中的消息,如果有reload标识,进行reload操作
def reload_spider():
""" 监听文件变化,自动reload """
rconn = redis.Redis(host=settings.REDIS_HOST, port=settings.REDIS_PORT, db=settings.REDIS_DB, password=settings.REDIS_PW)
while True:
try:
key = 'reload-spider'
value = rconn.get(key)
print value
if value == '1':
crawler_module = importlib.import_module('crawlers.%s' % 'temp'.lower())
reload(crawler_module)
crawlerClass = getattr(crawler_module, 'temp'.upper())
print 'reload_spider 中的class: %s' % (crawlerClass.name)
# rconn.delete(key)
except Exception, e:
pass
time.sleep(3)
经测试,其他线程中的引入的变量,也改变了。
当然,消息监听最好使用mq或者是redis阻塞队列
以上这篇Python重新加载模块的实现方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持码农之家。
以上就是本次给大家分享的关于java的全部知识点内容总结,大家还可以在下方相关文章里找到相关文章进一步学习,感谢大家的阅读和支持。
python重新加载文件_Python的重新加载知识点总结相关推荐
- python加载机制_Python 模块的加载顺序
基本概念 module 模块, 一个 py 文件或以其他文件形式存在的可被导入的就是一个模块 package 包,包含有 init 文件的文件夹 relative path 相对路径,相对于某个目录的 ...
- python多线程写同一个文件_Python多线程快速写入文件,python,飞速
Python多线程快速写入文件,python,飞速 发表时间:2020-07-10 乱序多线程写入 举个最简单的例子,只要求快速写入即可,对顺序无要求时: import threading def w ...
- python调用程序压缩文件_Python实现文件压缩和解压的示例代码
大家可能都熟悉.zip格式的文件.它可以把多个文件,压缩成一个文件.这在网络上传输时很有用,而且节省硬盘空间. 接下来,我们使用Python实现压缩和解压. 读取ZIP文件信息 要读取ZIP文件的内容 ...
- python可以处理哪些文件_Python(文件处理)
二.基本操作 #r''------------------>> r:原生字符串,不判断符号的含义 #文件处理 f=open(r'c:\a.txt','r',encoding='utf-8' ...
- python open函数创建文件_python中怎样使用open创建文件?
我们在使用open函数的时候,一般用到的都是打开的功能,这和小伙伴们平常理解的名称意思是一致的.其实我们还可以使用open函数来创建一个file,也就是文本文件.在开始创建之前,我们需要对open函数 ...
- python怎么发送代码文件_python 通过 socket 发送文件的实例代码
目录结构: client: #!/usr/bin/env python # -*-coding:utf-8 -*- import socket, struct, json download_dir = ...
- python扫描目录下文件_Python扫描目录读取文件,不考虑子目录
这篇文章主要为大家详细介绍了Python扫描目录读取文件,不考虑子目录,具有一定的参考价值,可以用来参考一下. 感兴趣Python扫描目录读取文件,不考虑子目录的小伙伴,下面一起跟随512笔记的小编罗 ...
- python读取所有txt文件_python如何批量读取txt文件
python批量读取txt文件的方法:首先导入系统模块:然后将文件夹路径更改为需要批量读取的txt文件存放的路径:再调用系统模块得到该文件夹下的所有文件名称:最后遍历文件夹,读取txt文件. 如果文件 ...
- python下的所有文件_python批量复制文件夹下所有文件大小
python复制文件夹下所有文件 Python---进阶---文件操作---获取文件夹下所有文件的数量和大小 一.####编写一个程序,统计当前目录下每个文件类型的文件数 ####思路: - 打开当前 ...
最新文章
- 模拟使用Flume监听日志变化,并且把增量的日志文件写入到hdfs中
- [html] 你有使用过ins标签吗?说说它的用途
- raml2html 安装,Raml实践
- row_number() over(partition by order by )使用说明书
- java web 数据库操作_Java Web----Java Web的数据库操作(二)
- 【人工智能】全网首发!2020年AI、CV、NLP等最全国际会议、顶会时间汇总!!
- 单击托盘显示菜单mfc_PhotoShop制作滚动菜单栏教程
- phpstorm的安装和破解
- 三菱梯形图转换成c语言,三菱PLC编程软件的梯形图程序的生成与批改
- 同步IO和异步IO的区别
- 计算机组装与维护启发式教学,电工技能与电子工艺技术实训
- Jmeter脚本录制 badboy的下载安装教程
- nef是什么格式?nef格式用什么软件打开?nef格式怎么转换成jpg
- 【Unity】Mesh网格编程(一)正二十面体
- 解决Jenkins集成SonarQube Scanner出现“Tasks support was removed in SonarQube 7.6.”的问题
- Python使用-错误“name ‘requests‘ is not defined”的探查
- 什么是PUGC、UGC、PGC、OGV、PUGV,了解视频平台运营模式
- 电脑中的耳机插进去没有反应
- case when 的使用
- 雨课堂知识点总结(九)
热门文章
- Box2d源码学习十二b2Collision之碰撞(上)公共部分的实现
- 百度AI开放平台人体分析_人像分割的Python示例代码
- 《Google Android开发入门与实战随书视频》
- 关于IOS7 AutoLayout的各种bug
- 中国残疾人福利基金会开展麻风救助行动
- 哪些人不适合吃山药?
- 京峰linux课程目录,京峰教育 Linux编程Shell从入门到精通视频教程
- 如何查看目前所有会话的状态oracle,Oracle一些常用查看数据库状态SQL
- java打印漏斗图案_寒假作业1打印漏斗
- Code Representation方面的Empirical Studies