日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

Python自動重新加載模塊詳解(autoreload module)

瀏覽:32日期:2022-07-31 14:42:22

守護(hù)進(jìn)程模式

使用python開發(fā)后臺服務(wù)程序的時(shí)候,每次修改代碼之后都需要重啟服務(wù)才能生效比較麻煩。

看了一下Python開源的Web框架(Django、Flask等)都有自己的自動加載模塊功能(autoreload.py),都是通過subprocess模式創(chuàng)建子進(jìn)程,主進(jìn)程作為守護(hù)進(jìn)程,子進(jìn)程中一個(gè)線程負(fù)責(zé)檢測文件是否發(fā)生變化,如果發(fā)生變化則退出,主進(jìn)程檢查子進(jìn)程的退出碼(exist code)如果與約定的退出碼一致,則重新啟動一個(gè)子進(jìn)程繼續(xù)工作。

自動重新加載模塊代碼如下:

autoreload.py

#!/usr/bin/env python# -*- coding: utf-8 -*-'''This module is used to test how to reload the modules automatically when anychanges is detected.'''__author__='Wenjun Xiao'import os,sys,time,subprocess,threaddef iter_module_files(): for module in sys.modules.values(): filename = getattr(module, ’__file__’, None) if filename: if filename[-4:] in (’.pyo’, ’.pyc’): filename = filename[:-1] yield filenamedef is_any_file_changed(mtimes): for filename in iter_module_files(): try: mtime = os.stat(filename).st_mtime except IOError: continue old_time = mtimes.get(filename, None) if old_time is None: mtimes[filename] = mtime elif mtime > old_time: return 1 return 0def start_change_detector(): mtimes = {} while 1: if is_any_file_changed(mtimes): sys.exit(3) time.sleep(1)def restart_with_reloader(): while 1: args = [sys.executable] + sys.argv new_env = os.environ.copy() new_env[’RUN_FLAG’] = ’true’ exit_code = subprocess.call(args, env=new_env) if exit_code != 3: return exit_codedef run_with_reloader(runner): if os.environ.get(’RUN_FLAG’) == ’true’: thread.start_new_thread(runner, ()) try: start_change_detector() except KeyboardInterrupt: pass else: try: sys.exit(restart_with_reloader()) except KeyboardInterrupt: pass

測試的主模塊如下:

runner.py

#!/usr/bin/env python# -*- coding: utf-8 -*-'''Runner for testing autoreload module.'''__author__='Wenjun Xiao'import os,timedef runner(): print '[%s]enter...' % os.getpid() while 1: time.sleep(1) print '[%s]runner.' % os.getpid()if __name__ == ’__main__’: from autoreload import run_with_reloader run_with_reloader(runner)

運(yùn)行runner.py:

promissing@ubuntu:python-autoreload$ python runner.py [11743]enter...

主程序已經(jīng)運(yùn)行,只不過是一致在循環(huán),可以查看此時(shí)有兩個(gè)進(jìn)程:

promissing@ubuntu:~$ ps -aux|grep runner[.py]promiss+ 11742 0.0 0.2 10928 4208 pts/0 S+ 19:34 0:00 python runner.pypromiss+ 11743 0.0 0.1 20152 4092 pts/0 Sl+ 19:34 0:00 /usr/bin/python runner.py

在編輯器中打開runner.py做一些可見的修改(增加一條打印語句)如下:

# runner.py...def runner(): print '[%s]enter...' % os.getpid() print '[%s]Runner has changed.' % os.getpid() while 1: time.sleep(1) print '[%s]runner.' % os.getpid()...

保存之后查看運(yùn)行運(yùn)行情況:

promissing@ubuntu:python-autoreload$ python runner.py [11743]enter...[11772]enter...[11772]Runner has changed.

可以看到新增的語句已經(jīng)生效,繼續(xù)看進(jìn)程情況:

promissing@ubuntu:~$ ps -aux|grep runner[.py]promiss+ 11742 0.0 0.2 10928 4220 pts/0 S+ 19:34 0:00 python runner.pypromiss+ 11772 0.0 0.1 20152 4092 pts/0 Sl+ 19:37 0:00 /usr/bin/python runner.py

可以對比兩次的進(jìn)程,可以看到使用守護(hù)進(jìn)程模式可以簡單的實(shí)現(xiàn)模塊自動重新加載功能。

使用守護(hù)進(jìn)程模式,有一種情況比較麻煩:如果主進(jìn)程由于其他原因退出了,那么子進(jìn)程還在運(yùn)行:

promissing@ubuntu:~$ kill 11742promissing@ubuntu:~$ ps -aux|grep runner[.py]promiss+ 11772 0.0 0.1 20152 4092 pts/0 Sl 19:37 0:00 /usr/bin/python runner.py

為了重啟服務(wù)還需要通過其他方式找到子進(jìn)程并結(jié)束它可以。

守護(hù)進(jìn)程模式-退出問題

為了解決由于守護(hù)進(jìn)程退出,而導(dǎo)致子進(jìn)程沒有退出的問題,一種比較簡單的解決方法就是在守護(hù)進(jìn)程退出的時(shí)候也把子進(jìn)程結(jié)束:

# autoreload.py...import signal..._sub_proc = Nonedef signal_handler(*args): global _sub_proc if _sub_proc: print '[%s]Stop subprocess:%s' % (os.getpid(), _sub_proc.pid) _sub_proc.terminate() sys.exit(0)def restart_with_reloader(): signal.signal(signal.SIGTERM, signal_handler) while 1: args = [sys.executable] + sys.argv new_env = os.environ.copy() new_env[’RUN_FLAG’] = ’true’ global _sub_proc _sub_proc = subprocess.Popen(args, env=new_env) exit_code = _sub_proc.wait() if exit_code != 3: return exit_code...

運(yùn)行,查看效果(這次沒有測試修改):

promissing@ubuntu:python-autoreload$ python runner.py[12425]enter...[12425]Runner has changed.[12424]Stop subprocess:12425

另一個(gè)控制臺執(zhí)行的命令如下:

promissing@ubuntu:~$ ps -aux|grep runner[.py]promiss+ 12424 0.2 0.2 10928 4224 pts/0 S+ 20:26 0:00 python runner.pypromiss+ 12425 0.2 0.1 20152 4092 pts/0 Sl+ 20:26 0:00 /usr/bin/python runner.pypromissing@ubuntu:~$ kill 12424promissing@ubuntu:~$ ps -aux|grep runner[.py]promissing@ubuntu:~$

已經(jīng)達(dá)到我們需要的功能了嗎?等等,在控制臺上運(yùn)行工程總是能很好的工作,如果是在IDE中呢?由于IDE中輸入輸出是重定向處理的,比如,在Sublime中就沒有辦法獲取到輸出信息。

因此還需要進(jìn)一步完善輸出的問題。

守護(hù)進(jìn)程模式-輸出問題

解決輸出問題,也很簡單,修改如下:

# autoreload.py...def restart_with_reloader(): signal.signal(signal.SIGTERM, signal_handler) while 1: args = [sys.executable] + sys.argv new_env = os.environ.copy() new_env[’RUN_FLAG’] = ’true’ global _sub_proc _sub_proc = subprocess.Popen(args, env=new_env, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) read_stdout(_sub_proc.stdout) exit_code = _sub_proc.wait() if exit_code != 3: return exit_code...def read_stdout(stdout): while 1: data = os.read(stdout.fileno(), 2**15) if len(data) > 0: sys.stdout.write(data) else: stdout.close() sys.stdout.flush() break

經(jīng)過以上修改,也適合在IDE中使用守護(hù)進(jìn)程模式了。

源代碼:https://github.com/wenjunxiao/python-autoreload

以上這篇Python自動重新加載模塊詳解(autoreload module)就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Python 編程
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
久久麻豆精品| 丝袜美腿亚洲一区| 一区二区国产在线观看| 视频一区中文字幕| 麻豆精品91| 日韩不卡手机在线v区| 亚洲精品高潮| 国产精品任我爽爆在线播放| 电影亚洲精品噜噜在线观看| 国产乱码精品一区二区三区四区| 日韩精彩视频在线观看| 男人操女人的视频在线观看欧美| 99在线|亚洲一区二区| 中文一区一区三区免费在线观 | 亚洲午夜久久| 婷婷成人av| 国产高清精品二区| 亚州精品视频| 欧美极品中文字幕| 日韩在线免费| 久久先锋影音| 久久中文在线| 一区在线免费观看| 国产美女精品视频免费播放软件| 国产精品蜜芽在线观看| 天堂网av成人| 亚洲深夜福利在线观看| 国产精品亚洲人成在99www| 欧美a一区二区| 亚洲视频www| 四虎国产精品免费观看| 亚洲精品电影| 欧美国产专区| 中文字幕一区二区三区四区久久| 日本麻豆一区二区三区视频| 综合激情网...| 91av亚洲| 欧美国产中文高清| 婷婷亚洲精品| 欧洲毛片在线视频免费观看| 国产精品午夜av| 免费在线观看视频一区| 精品久久国产一区| 婷婷综合福利| 国产亚洲精品自拍| 日韩精品网站| 国产成人精品一区二区免费看京 | 日本成人在线一区| 午夜av一区| 久久九九99| 国产传媒在线| 免费观看日韩电影| 成人在线免费观看91| 国产精品嫩模av在线| 鲁大师成人一区二区三区| bbw在线视频| 成人日韩av| 久久精品国产99国产精品| 欧美日韩一区自拍| 亚洲精选久久| 亚洲精品激情| 日韩手机在线| 日韩成人一级| 国产日韩视频在线| 国产欧美一区二区色老头| 日韩中文av| 国产欧美欧美| 精品一区不卡| 亚洲人成在线网站| 欧美丝袜一区| 悠悠资源网久久精品| 日韩精品第一| 国产情侣久久| 国产精品一区二区av日韩在线| 日韩在线a电影| 日韩精品欧美| 欧美日韩水蜜桃| 国产美女精品| 日韩国产欧美三级| 清纯唯美亚洲综合一区| 国产欧美综合一区二区三区| 国产精品啊v在线| 亚洲最新无码中文字幕久久| av在线日韩| 蜜桃传媒麻豆第一区在线观看| 欧美日韩国产亚洲一区| 色婷婷久久久| 蜜臀91精品一区二区三区| 国产免费av一区二区三区| 四季av一区二区凹凸精品| 91成人精品视频| 日韩高清中文字幕一区| 日产午夜精品一线二线三线| 久久在线视频免费观看| 日韩中文字幕视频网| 91视频一区| 日韩激情网站| 免费观看久久av| 欧美国产三级| 亚洲一级网站| 丝袜美腿成人在线| 精品中文字幕一区二区三区四区| 欧美精选一区二区三区| 国产精品久久久久av蜜臀| 国产精品外国| 欧美日韩一二三四| 丰满少妇一区| 欧美片第1页综合| 亚洲在线免费| 99精品国产一区二区三区| 国产日韩精品视频一区二区三区| 欧美日韩四区| 超碰在线99| 亚洲第一区色| 精品国产一区二| 日韩在线a电影| 国产精品88久久久久久| www在线观看黄色| 国产精品啊啊啊| 国产日韩亚洲| 国产日韩一区| 国产日韩中文在线中文字幕| 亚洲人成精品久久久| 三上悠亚国产精品一区二区三区 | 青青伊人久久| 蜜臀91精品一区二区三区| 男人天堂欧美日韩| 一区在线观看| 久久人人88| 精品中文字幕一区二区三区av| 日韩成人综合| 成人午夜国产| 午夜一区在线| 蜜臀久久99精品久久一区二区| 婷婷综合六月| 不卡av一区二区| 蜜臀久久99精品久久久画质超高清| 在线视频免费在线观看一区二区| 亚洲精品123区| 日韩欧美美女在线观看| 国产欧美一区二区色老头| 久久99精品久久久野外观看| 卡一卡二国产精品| 精品国产乱码久久久久久樱花| 开心激情综合| 狠狠干成人综合网| 亚洲欧美一区在线| 尤物精品在线| 国产精品香蕉| 日韩精品影视| 日本va欧美va精品发布| 成人精品国产亚洲| 国产精品免费看| 久久久国产精品入口麻豆| 久久午夜精品| 欧美日韩在线观看首页| 久久精品1区| 日韩黄色av| 国产成人精品一区二区免费看京| 蜜桃tv一区二区三区| 国产欧美日韩精品一区二区免费| 特黄特色欧美大片| 国产精品久久久久久久久久齐齐| 成人三级高清视频在线看| 热久久免费视频| 欧美aa在线观看| 911亚洲精品| 亚洲欧美日韩国产一区二区| 国产中文欧美日韩在线| 日本v片在线高清不卡在线观看| www.51av欧美视频| 国产精品午夜一区二区三区| 亚洲欧美日韩精品一区二区 | 欧美日韩尤物久久| 日韩区欧美区| 亚洲综合激情在线| 精品国产18久久久久久二百| 日韩在线播放一区二区| 日韩美女一区二区三区在线观看| 日韩精品一区二区三区中文| 欧洲一级精品| 福利欧美精品在线| 国产精品亚洲综合久久| 国产农村妇女精品一二区| 成人国产精选| 日本久久一区| 日韩av一区二区在线影视| 午夜在线一区二区| 欧美精品黄色| 99热精品在线观看| 亚洲欧美日韩一区在线观看| 91看片一区| 香蕉视频亚洲一级| 久久九九99| 国产精品av一区二区| 日韩国产网站| 宅男噜噜噜66国产日韩在线观看| 999国产精品视频| 精品一区欧美| 久久激情五月婷婷|