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

您的位置:首頁技術文章
文章詳情頁

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

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

守護進程模式

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

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

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

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)

運行runner.py:

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

主程序已經運行,只不過是一致在循環,可以查看此時有兩個進程:

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()...

保存之后查看運行運行情況:

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

可以看到新增的語句已經生效,繼續看進程情況:

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

可以對比兩次的進程,可以看到使用守護進程模式可以簡單的實現模塊自動重新加載功能。

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

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

為了重啟服務還需要通過其他方式找到子進程并結束它可以。

守護進程模式-退出問題

為了解決由于守護進程退出,而導致子進程沒有退出的問題,一種比較簡單的解決方法就是在守護進程退出的時候也把子進程結束:

# 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...

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

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

另一個控制臺執行的命令如下:

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:~$

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

因此還需要進一步完善輸出的問題。

守護進程模式-輸出問題

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

# 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

經過以上修改,也適合在IDE中使用守護進程模式了。

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

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

標簽: Python 編程
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
久久不射网站| 国产a久久精品一区二区三区| 正在播放日韩精品| 国产一区二区三区亚洲| 欧美激情视频一区二区三区免费 | 亚洲精品日本| 亚洲日本欧美| 日本成人手机在线| 青草综合视频| 麻豆成人91精品二区三区| 日本激情一区| 久久狠狠婷婷| 夜鲁夜鲁夜鲁视频在线播放| 99久久婷婷这里只有精品| 婷婷中文字幕一区| 在线观看一区| 国产精品亚洲欧美日韩一区在线 | 中文字幕在线看片| 蜜桃av.网站在线观看| 久久久久久久久丰满| 欧美.日韩.国产.一区.二区 | 在线中文字幕播放| 日韩av免费| 亚洲一区日韩| 国产亚洲精品美女久久久久久久久久| 国产精品巨作av| 日本不良网站在线观看| 欧美高清一区| 日本免费新一区视频| 国产一区一一区高清不卡| 久久中文视频| 亚洲精品看片| 国产日本久久| 成人精品久久| 欧美一区=区| 国产精品欧美一区二区三区不卡 | 91日韩免费| 国产精品普通话对白| 日韩精品国产精品| 国产成人精品一区二区免费看京 | 日韩精品一区二区三区中文在线| 国产精品一区二区三区av麻| 日韩欧美三级| 日韩精品一二三区| 你懂的国产精品永久在线| 成人啊v在线| 日韩精品视频中文字幕| 中文字幕一区久| 亚洲欧洲日韩| 神马午夜在线视频| 中文字幕一区二区精品区| 国产精品成久久久久| 好吊日精品视频| 欧美日韩亚洲一区二区三区在线 | 亚洲电影在线一区二区三区| 91嫩草精品| 五月综合激情| 老司机免费视频一区二区三区| 九九久久电影| 国产日韩三级| 国产一区二区高清| 日韩成人精品一区二区| 日韩二区三区在线观看| 久久久成人网| 国产欧美日韩精品一区二区三区| 亚洲成人二区| 麻豆极品一区二区三区| 日韩中文字幕不卡| 久久久久久久久久久妇女| 国产精品一区二区三区四区在线观看| 欧洲激情综合| 国产一区二区三区黄网站| 免费在线看一区| 日韩在线欧美| 免费日韩一区二区三区| 久久先锋影音| 日韩一区自拍| 国产精品黄色片| 在线观看亚洲精品福利片| 欧美三级精品| 日韩一区网站| 亚洲免费激情| 蜜桃成人精品| 欧美激情日韩| 日韩avvvv在线播放| 99香蕉国产精品偷在线观看| 国产va在线视频| 免费视频一区二区三区在线观看| 亚洲精品美女| 久久午夜影视| 欧美精品一区二区久久| 国内精品伊人| 国产精品xxx在线观看| 综合日韩在线| 美女日韩在线中文字幕| 91精品韩国| 免费日韩一区二区三区| 人人爱人人干婷婷丁香亚洲| 只有精品亚洲| 国产一区成人| 日韩一级不卡| 亚洲精品一区二区在线看| 久久精品亚洲人成影院| jizzjizz中国精品麻豆| 国产一区精品福利| 嫩草伊人久久精品少妇av杨幂| 91伊人久久| 日韩激情啪啪| 无码日韩精品一区二区免费| 免费在线观看成人| 91久久久精品国产| 欧美成人精品| 亚洲精品一二三区区别| 欧美日韩精品一本二本三本 | 精品国产一级| 欧美激情福利| 欧美黑人巨大videos精品| 日韩精品高清不卡| 日本综合视频| 日本在线成人| 热久久久久久| 亚洲精品无吗| 亚洲bt欧美bt精品777| 亚洲理论在线| 亚洲欧洲日韩精品在线| 日本在线不卡视频| 日韩精品亚洲一区二区三区免费| 日本在线视频一区二区| 日韩av黄色在线| 国产极品模特精品一二| 精品国产日韩欧美精品国产欧美日韩一区二区三区 | 日韩av中文字幕一区二区| 日韩一区二区三免费高清在线观看| 中文无码久久精品| 日韩av字幕| 国产精品视频一区二区三区四蜜臂| 国产伦理一区| 韩国一区二区三区视频| 精品三级久久| 欧美日韩激情在线一区二区三区| 国产农村妇女精品一区二区| 日韩一区二区三免费高清在线观看| 日韩高清不卡一区| 国产日韩高清一区二区三区在线| 久久wwww| 日本一区二区高清不卡| 日本精品不卡| 国产精品美女久久久浪潮软件| 日韩在线观看一区二区三区| 国产欧美另类| 成人日韩av| 欧美 日韩 国产一区二区在线视频 | 国产成人精品一区二区三区视频| 国产精品成久久久久| 日韩欧美少妇| 老司机精品久久| 久久国产欧美日韩精品| 国产毛片久久久| 精品久久视频| 99国产精品久久久久久久| 日韩毛片一区| 成人高清一区| 国产视频一区在线观看一区免费| 日本亚洲视频| 日韩综合一区| 亚洲一区黄色| 国产精品一线天粉嫩av| 日本精品影院| 日韩三级视频| 欧美一级鲁丝片| 日韩影院在线观看| 美女视频黄 久久| 久久人人精品| 久久xxxx| 精品久久网站| 手机精品视频在线观看| 欧美黄页在线免费观看| 1000部精品久久久久久久久| 亚洲午夜国产成人| 老司机精品视频网| 先锋影音久久久| 高清av一区| 天堂va在线高清一区| 成人黄色av| 久久亚洲精品伦理| 成人在线丰满少妇av| 巨乳诱惑日韩免费av| 国产美女精品视频免费播放软件| 天堂√中文最新版在线| 日韩中文字幕91| 精品五月天堂| 一区在线免费观看| 精品一区二区三区中文字幕视频| 婷婷丁香综合| 国产成年精品| 亚洲人亚洲人色久| 神马午夜在线视频| 日韩精品欧美成人高清一区二区| 日产午夜精品一线二线三线| 蜜桃久久精品一区二区|