1. 程式人生 > >多線程與計劃任務

多線程與計劃任務

線程 normal 實例 啟動程序 指定 scheduler target web 執行

通常,程序在文件中最後一行代碼執行後終止(或調用sys.exit())。

在程序的所有線程終止之前,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哲學:編寫小的、目的有限的、能互操作的程序,勝過大的、功能豐富的應用程序。


多線程與計劃任務