简述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的重新加载知识点总结相关推荐

  1. python加载机制_Python 模块的加载顺序

    基本概念 module 模块, 一个 py 文件或以其他文件形式存在的可被导入的就是一个模块 package 包,包含有 init 文件的文件夹 relative path 相对路径,相对于某个目录的 ...

  2. python多线程写同一个文件_Python多线程快速写入文件,python,飞速

    Python多线程快速写入文件,python,飞速 发表时间:2020-07-10 乱序多线程写入 举个最简单的例子,只要求快速写入即可,对顺序无要求时: import threading def w ...

  3. python调用程序压缩文件_Python实现文件压缩和解压的示例代码

    大家可能都熟悉.zip格式的文件.它可以把多个文件,压缩成一个文件.这在网络上传输时很有用,而且节省硬盘空间. 接下来,我们使用Python实现压缩和解压. 读取ZIP文件信息 要读取ZIP文件的内容 ...

  4. python可以处理哪些文件_Python(文件处理)

    二.基本操作 #r''------------------>> r:原生字符串,不判断符号的含义 #文件处理 f=open(r'c:\a.txt','r',encoding='utf-8' ...

  5. python open函数创建文件_python中怎样使用open创建文件?

    我们在使用open函数的时候,一般用到的都是打开的功能,这和小伙伴们平常理解的名称意思是一致的.其实我们还可以使用open函数来创建一个file,也就是文本文件.在开始创建之前,我们需要对open函数 ...

  6. python怎么发送代码文件_python 通过 socket 发送文件的实例代码

    目录结构: client: #!/usr/bin/env python # -*-coding:utf-8 -*- import socket, struct, json download_dir = ...

  7. python扫描目录下文件_Python扫描目录读取文件,不考虑子目录

    这篇文章主要为大家详细介绍了Python扫描目录读取文件,不考虑子目录,具有一定的参考价值,可以用来参考一下. 感兴趣Python扫描目录读取文件,不考虑子目录的小伙伴,下面一起跟随512笔记的小编罗 ...

  8. python读取所有txt文件_python如何批量读取txt文件

    python批量读取txt文件的方法:首先导入系统模块:然后将文件夹路径更改为需要批量读取的txt文件存放的路径:再调用系统模块得到该文件夹下的所有文件名称:最后遍历文件夹,读取txt文件. 如果文件 ...

  9. python下的所有文件_python批量复制文件夹下所有文件大小

    python复制文件夹下所有文件 Python---进阶---文件操作---获取文件夹下所有文件的数量和大小 一.####编写一个程序,统计当前目录下每个文件类型的文件数 ####思路: - 打开当前 ...

最新文章

  1. 模拟使用Flume监听日志变化,并且把增量的日志文件写入到hdfs中
  2. [html] 你有使用过ins标签吗?说说它的用途
  3. raml2html 安装,Raml实践
  4. row_number() over(partition by order by )使用说明书
  5. java web 数据库操作_Java Web----Java Web的数据库操作(二)
  6. 【人工智能】全网首发!2020年AI、CV、NLP等最全国际会议、顶会时间汇总!!
  7. 单击托盘显示菜单mfc_PhotoShop制作滚动菜单栏教程
  8. phpstorm的安装和破解
  9. 三菱梯形图转换成c语言,三菱PLC编程软件的梯形图程序的生成与批改
  10. 同步IO和异步IO的区别
  11. 计算机组装与维护启发式教学,电工技能与电子工艺技术实训
  12. Jmeter脚本录制 badboy的下载安装教程
  13. nef是什么格式?nef格式用什么软件打开?nef格式怎么转换成jpg
  14. 【Unity】Mesh网格编程(一)正二十面体
  15. 解决Jenkins集成SonarQube Scanner出现“Tasks support was removed in SonarQube 7.6.”的问题
  16. Python使用-错误“name ‘requests‘ is not defined”的探查
  17. 什么是PUGC、UGC、PGC、OGV、PUGV,了解视频平台运营模式
  18. 电脑中的耳机插进去没有反应
  19. case when 的使用
  20. 雨课堂知识点总结(九)

热门文章

  1. Box2d源码学习十二b2Collision之碰撞(上)公共部分的实现
  2. 百度AI开放平台人体分析_人像分割的Python示例代码
  3. 《Google Android开发入门与实战随书视频》
  4. 关于IOS7 AutoLayout的各种bug
  5. 中国残疾人福利基金会开展麻风救助行动
  6. 哪些人不适合吃山药?
  7. 京峰linux课程目录,京峰教育 Linux编程Shell从入门到精通视频教程
  8. 如何查看目前所有会话的状态oracle,Oracle一些常用查看数据库状态SQL
  9. java打印漏斗图案_寒假作业1打印漏斗
  10. Code Representation方面的Empirical Studies