多線程與計劃任務
在程序的所有線程終止之前,python程序不會終止。
多線程也可能會導致所謂的並發問題。如果這些線程同時讀寫變量,導致互相幹擾,就會發生並發問題。
為了避免並發問題,絕不讓多個線程讀取或寫入相同的變量。
當創建一個新的Thread對象時,要確保其目標函數只使用該函數中的局部變量。
>>> import threading >>> threadObj=threading.Thread(target=print,args=['a','b','c'],kwargs={'sep':' & '}) >>> threadObj.start() a & b & c
利用內建的subprocess模塊中的Popen()函數,python程序可以啟動計算機中的其他程序。
如果打開一個應用程序的多個實例,每個實例都是同一個程序的不同進程。
每個進程可以有多個線程。不像線程,進程無法直接讀寫另一個進程的變量。
返回值是一個Popen對象,它有兩種可用的方法:poll()和wait()。
如果這個進程在poll()調用時仍在運行,poll()方法就返回None。如果該程序已經終止,它會返回該進程的整數退出代碼。退出代碼用於說明進程是無錯終止(退出代碼為0),還是一個錯誤導致進程終止。
wait()方法將阻塞,直到啟動的進程終止。它的返回值是進程的整數退出代碼。
可以向Popen()傳遞一個列表,作為唯一的參數。該列表中的第一個字符串是要啟動的程序的可執行文件名,所有後續的字符串將是該程序啟動時,傳遞給該程序的命令行參數。實際上,這個列表將作為被啟動程序的sys.argv的值。
>>> import subprocess >>> subprocess.Popen('/usr/bin/pwd') /root <subprocess.Popen object at 0x7f9e39d23438>
計劃任務:Task Scheduler(windows)、launchd(OS X)、cron(linux)
webbrowser.open()函數可以從程序啟動web遊覽器,打開指定的網站。
可以在python中啟動另一個python腳本,就像任何其他的應用程序一樣。只需要向Popen()傳入python.exe可執行文件,並將想運行的.py腳本的文件名作為它的參數。
不同於將python程序導入為一個模塊,如果python程序啟動了另一個python程序,兩者將在獨立的進程運行,不能分享彼此的變量。
每個操作系統都有一個程序,其行為等價於雙擊文檔文件來打開它。在windows上,這是start程序。在OS X上,這是open程序。在ubuntu linux上,這是see程序。
>>> import subprocess >>> subprocess.Popen(['start','hello.txt'],shell=True)
Unix哲學:編寫小的、目的有限的、能互操作的程序,勝過大的、功能豐富的應用程序。
多線程與計劃任務