當前位置:首頁 » 編程語言 » python子進程id

python子進程id

發布時間: 2023-08-09 14:37:44

❶ 如何在python腳本中新建一個守護子進程

函數實現
[html] view plain
#!/usr/bin/env python
#coding: utf-8
import sys, os

'''將當前進程fork為一個守護進程
注意:如果你的守護進程是由inetd啟動的,不要這樣做!inetd完成了
所有需要做的事情,包括重定向標准文件描述符,需要做的事情只有chdir()和umask()了
'''

def daemonize (stdin='/dev/null', stdout='/dev/null', stderr='/dev/null'):
#重定向標准文件描述符(默認情況下定向到/dev/null)
try:
pid = os.fork()
#父進程(會話組頭領進程)退出,這意味著一個非會話組頭領進程永遠不能重新獲得控制終端。
if pid > 0:
sys.exit(0) #父進程退出
except OSError, e:
sys.stderr.write ("fork #1 failed: (%d) %s\n" % (e.errno, e.strerror) )
sys.exit(1)

#從母體環境脫離
os.chdir("/") #chdir確認進程不保持任何目錄於使用狀態,否則不能umount一個文件系統。也可以改變到對於守護程序運行重要的文件所在目錄
os.umask(0) #調用umask(0)以便擁有對於寫的任何東西的完全控制,因為有時不知道繼承了什麼樣的umask。
os.setsid() #setsid調用成功後,進程成為新的會話組長和新的進程組長,並與原來的登錄會話和進程組脫離。

#執行第二次fork
try:
pid = os.fork()
if pid > 0:
sys.exit(0) #第二個父進程退出
except OSError, e:
sys.stderr.write ("fork #2 failed: (%d) %s\n" % (e.errno, e.strerror) )
sys.exit(1)

#進程已經是守護進程了,重定向標准文件描述符

for f in sys.stdout, sys.stderr: f.flush()
si = open(stdin, 'r')
so = open(stdout, 'a+')
se = open(stderr, 'a+', 0)
os.p2(si.fileno(), sys.stdin.fileno()) #p2函數原子化關閉和復制文件描述符
os.p2(so.fileno(), sys.stdout.fileno())
os.p2(se.fileno(), sys.stderr.fileno())

#示例函數:每秒列印一個數字和時間戳
def main():
import time
sys.stdout.write('Daemon started with pid %d\n' % os.getpid())
sys.stdout.write('Daemon stdout output\n')
sys.stderr.write('Daemon stderr output\n')
c = 0
while True:
sys.stdout.write('%d: %s\n' %(c, time.ctime()))
sys.stdout.flush()
c = c+1
time.sleep(1)

if __name__ == "__main__":
daemonize('/dev/null','/tmp/daemon_stdout.log','/tmp/daemon_error.log')
main()
可以通過命令ps -ef | grep daemon.py查看後台運行的繼承,在/tmp/daemon_error.log會記錄錯誤運行日誌,在/tmp/daemon_stdout.log會記錄標准輸出日誌。

❷ 如何將調試器附加到python子進程

從「調試」菜單中選擇「附加到進程」。(如果沒有打開任何項目,請從「工具」菜單中選擇「附加到進程」。)
在「附加到進程」對話框的「可用進程」列表中,找到要附加到的程序。
如果要調試的程序運行在另一台計算器上,必須首先選擇該遠程計算機。(有關更多信息,請參見
。)如果進程在其他用戶帳戶下運行,請選中「顯示來自所有用戶的進程」框。
如果已通過「遠程桌面連接」連接,請選中「顯示所有會話中的進程」框。
在「附加到」框中,確保要調試的代碼類型已列出,或「自動: 託管代碼」已顯示。否則:
單擊「選擇」。
在「選擇代碼類型」對話框中,單擊「調試以下代碼類型」,然後選擇要調試的類型。
單擊「確定」。
單擊「附加」按鈕。
打開「進程」對話框時,會自動顯示「可用進程」列表。對話框打開時進程仍能在後台中開始和停止,因此內容可能並非始終是最新內容。通過按「刷新」,可以隨時刷新列表以查看當前進程列表。
調試時可以附加到多個程序,但在任何給定時間,調試器中只有一個程序處於活動狀態。可以在「調試位置」工具欄中設置活動程序。有關更多信息,請參見
所有的「調試」菜單執行命令都會影響活動程序。可以通過「進程」對話框中斷任何已調試的程序。有關更多信息,請參見
注意為使調試器附加到用 Visual C++ 編寫的代碼,該代碼需要發出
DebuggableAttribute
。可通過鏈接
/ASSEMBLYDEBUG
鏈接器選項將它自動添加到代碼中。
注意如果試圖附加到不受信任的用戶帳戶擁有的進程,則會出現安全警告對話框確認。有關更多信息,請參見
安全警告:附加到不受信任的進程可能會有危險。
注意在某些情況下,在「終端服務」(「遠程桌面」)會話中進行調試時,「可用進程」列表不會顯示所有可用進程。在 Windows Server 2003 或更高版本上,如果您以受限用戶身份運行 Visual Studio,則「可用進程」列表不會顯示在會話 0 中運行的進程,會話 0 用於服務以及包括 w3wp.exe 在內的其他伺服器進程。您可以通過以下方法解決該問題:使用管理員帳戶運行 Visual Studio 或從伺服器控制台而不是「終端服務」會話運行 Visual Studio。如果這兩種解決方法都不奏效,第三種方法是通過從 Windows 命令行運行
vsjitdebugger.exe -pProcessId來附加到進程。您可以使用 tlist.exe 來確定進程 ID。

❸ python fork id為0是子進程么

python的os mole中有fork()函數用於生成子進程,生成的子進程是父進程的鏡像,但是它們有各自的地址空間,子進程復制一份父進程內存給自己
兩個進程之間的執行是相互獨立的,其執行順序可以是不確定的、隨機的、不可預測的,這點與多線程的執行順序相似。

❹ python 多進程

基於官方文檔:
https://docs.python.org/zh-cn/3/library/multiprocessing.html
日樂購,剛才看到的一個博客,寫的都不太對,還是基於官方的比較穩妥
我就是喜歡抄官方的,哈哈

通常我們使用Process實例化一個進程,並調用 他的 start() 方法啟動它。
這種方法和 Thread 是一樣的。

上圖中,我寫了 p.join() 所以主進程是 等待 子進程執行完後,才執行 print("運行結束")
否則就是反過來了(這個不一定,看你的語句了,順序其實是隨機的)例如:

主進加個 sleep

所以不加join() ,其實子進程和主進程是各干各的,誰也不等誰。都執行完後,文件運行就結束了

上面我們用了 os.getpid() 和 os.getppid() 獲取 當前進程,和父進程的id
下面就講一下,這兩個函數的用法:
os.getpid()
返回當前進程的id
os.getppid()
返回父進程的id。 父進程退出後,unix 返回初始化進程(1)中的一個
windows返回相同的id (可能被其他進程使用了)
這也就解釋了,為啥我上面 的程序運行多次, 第一次列印的parentid 都是 14212 了。
而子進程的父級 process id 是調用他的那個進程的 id : 1940

視頻筆記:
多進程:使用大致方法:

參考: 進程通信(pipe和queue)

pool.map (函數可以有return 也可以共享內存或queue) 結果直接是個列表

poll.apply_async() (同map,只不過是一個進程,返回結果用 xx.get() 獲得)

報錯:

參考 : https://blog.csdn.net/xiemanR/article/details/71700531

把 pool = Pool() 放到 if name == " main ": 下面初始化搞定。
結果:

這個肯定有解釋的

測試多進程計算效果:
進程池運行:

結果:

普通計算:

我們同樣傳入 1 2 10 三個參數測試:

其實對比下來開始快了一半的;
我們把循環里的數字去掉一個 0;
單進程:

多進程:

兩次測試 單進程/進程池 分別為 0.669 和 0.772 幾乎成正比的。
問題 二:
視圖:
post 視圖裡面

Music 類:

直接報錯:

寫在 類裡面也 在函數里用 self.pool 調用也不行,也是相同的錯誤。

最後 把 pool = Pool 直接寫在 search 函數裡面,奇跡出現了:

前台也能顯示搜索的音樂結果了

總結一點,進程這個東西,最好 寫在 直接運行的函數裡面,而不是 一個函數跳來跳去。因為最後可能 是在子進程的子進程運行的,這是不許的,會報錯。
還有一點,多進程運行的函數對象,不能是 lambda 函數。也許lambda 虛擬,在內存??

使用 pool.map 子進程 函數報錯,導致整個 pool 掛了:
參考: https://blog.csdn.net/hedongho/article/details/79139606
主要你要,對函數內部捕獲錯誤,而不能讓異常拋出就可以了。

關於map 傳多個函數參數
我一開始,就是正常思維,多個參數,搞個元祖,讓參數一一對應不就行了:

報錯:

參考:
https://blog.csdn.net/qq_15969343/article/details/84672527
普通的 process 當讓可以穿多個參數,map 卻不知道咋傳的。
apply_async 和map 一樣,不知道咋傳的。

最簡單的方法:
使用 starmap 而不是 map

結果:
子進程結束
1.8399453163146973
成功拿到結果了

關於map 和 starmap 不同的地方看源碼

關於apply_async() ,我沒找到多參數的方法,大不了用 一個迭代的 starmap 實現。哈哈

關於 上面源碼裡面有 itertools.starmap
itertools 用法參考:
https://docs.python.org/zh-cn/3/library/itertools.html#itertool-functions

有個問題,多進程最好不要使用全部的 cpu , 因為這樣可能影響其他任務,所以 在進程池 添加 process 參數 指定,cpu 個數:

上面就是預留了 一個cpu 干其他事的

後面直接使用 Queue 遇到這個問題:

解決:
Manager().Queue() 代替 Queue()

因為 queue.get() 是堵塞型的,所以可以提前判斷是不是 空的,以免堵塞進程。比如下面這樣:
使用 queue.empty() 空為True

❺ python 中os.system和commands.getoutput的區別

1. 使用os.system("cmd")

這是最簡單的一種方法,特點是執行的時候程序會打出cmd在linux上執行的信息。使用前需要import os。

[python]

os.system("ls")

2. 使用Popen模塊產生新的process

現在大部分人都喜歡使用Popen。Popen方法不會列印出cmd在linux上執
行的信息。的確,Popen非常強大,支持多種參數和模式。使用前需要from subprocess import Popen,
PIPE。但是Popen函數有一個缺陷,就是它是一個阻塞的方法。如果運行cmd時產生的內容非常多,函數非常容易阻塞住。解決辦法是不使用
wait()方法,但是也不能獲得執行的返回值了。

Popen原型是:

[python]

subprocess.Popen(args, bufsize=0, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=False, shell=False, cwd=None, env=None, universal_newlines=False, startupinfo=None, creationflags=0)

參數bufsize:指定緩沖。我到現在還不清楚這個參數的具體含義,望各個大牛指點。

參數executable用於指定可執行程序。一般情況下我們通過args參數來設置所要運行的程序。如果將參數shell設為 True,executable將指定程序使用的shell。在windows平台下,默認的shell由COMSPEC環境變數來指定。

參數stdin, stdout, stderr分別表示程序的標准輸入、輸出、錯誤句柄。他們可以是PIPE,文件描述符或文件對象,也可以設置為None,表示從父進程繼承。

參數preexec_fn只在Unix平台下有效,用於指定一個可執行對象(callable object),它將在子進程運行之前被調用。

參數Close_sfs:在windows平台
下,如果close_fds被設置為True,則新創建的子進程將不會繼承父進程的輸入、輸出、錯誤管
道。我們不能將close_fds設置為True同時重定向子進程的標准輸入、輸出與錯誤(stdin, stdout, stderr)。

如果參數shell設為true,程序將通過shell來執行。

參數cwd用於設置子進程的當前目錄。

參數env是字典類型,用於指定子進程的環境變數。如果env = None,子進程的環境變數將從父進程中繼承。

參數Universal_newlines:不同操作系統下,文本的換行符是不一樣的。如:windows下用』/r/n』表示換,而Linux下用 『/n』。如果將此參數設置為True,Python統一把這些換行符當作』/n』來處理。

參數startupinfo與createionflags只在windows下用效,它們將被傳遞給底層的CreateProcess()函數,用 於設置子進程的一些屬性,如:主窗口的外觀,進程的優先順序等等。

subprocess.PIPE
在創建Popen對象時,subprocess.PIPE可以初始化stdin, stdout或stderr參數,表示與子進程通信的標准流。

subprocess.STDOUT
創建Popen對象時,用於初始化stderr參數,表示將錯誤通過標准輸出流輸出。

Popen的方法:

Popen.poll()
用於檢查子進程是否已經結束。設置並返回returncode屬性。

Popen.wait()
等待子進程結束。設置並返回returncode屬性。

Popen.communicate(input=None)
與子進程進行交互。向stdin發送數據,或從stdout和stderr中讀取數據。可選參數input指定發送到子進程的參數。
Communicate()返回一個元組:(stdoutdata,
stderrdata)。注意:如果希望通過進程的stdin向其發送數據,在創建Popen對象的時候,參數stdin必須被設置為PIPE。同樣,如
果希望從stdout和stderr獲取數據,必須將stdout和stderr設置為PIPE。

Popen.send_signal(signal)
向子進程發送信號。

Popen.terminate()
停止(stop)子進程。在windows平台下,該方法將調用Windows API TerminateProcess()來結束子進程。

Popen.kill()
殺死子進程。

Popen.stdin
如果在創建Popen對象是,參數stdin被設置為PIPE,Popen.stdin將返回一個文件對象用於策子進程發送指令。否則返回None。

Popen.stdout
如果在創建Popen對象是,參數stdout被設置為PIPE,Popen.stdout將返回一個文件對象用於策子進程發送指令。否則返回 None。

Popen.stderr
如果在創建Popen對象是,參數stdout被設置為PIPE,Popen.stdout將返回一個文件對象用於策子進程發送指令。否則返回 None。

Popen.pid
獲取子進程的進程ID。

Popen.returncode
獲取進程的返回值。如果進程還沒有結束,返回None。

例如:

[python]

p = Popen("cp -rf a/* b/", shell=True, stdout=PIPE, stderr=PIPE)
p.wait()
if p.returncode != 0:
print "Error."
return -1

3. 使用commands.getstatusoutput方法
這個方法也不會列印出cmd在linux上執行的信息。這個方法唯一的優點是,它不是一個阻塞的方法。即沒有Popen函數阻塞的問題。使用前需要import commands。

例如:

[python]

status, output = commands.getstatusoutput("ls")

還有隻獲得output和status的方法:

[python]

commands.getoutput("ls")
commands.getstatus("ls")

❻ python 獲取進程的pid

方法一:
使用subprocess 的check_output函數執行pidof命令

方法二:

使用pgrep命令,pgrep獲取的結果與pidof獲得的結果稍有不同.pgrep的孝手改進程id稍多幾個.pgrep命令可以使適用subprocess的check_out函數執行

方法三:
獲取當前腳本的pid進程

方法四:命令獲取+kill PID

說明:

注意:linux的進程號最大是是 32768 (32 位系統)和 2 的 22 次方(400w 左右)(64 位系統)。cut -c 9-15不夠巧判薯喚,改成awk '{print $2}'

❼ python os.fock 創建的子進程里如果是個死循環,怎麼強制結束進程

os.fork()正常返回創建的子進程id,可以使用

os.kill(pid,sig)

殺死子進程。

❽ python中怎麼根據進程號獲取進程名

安裝第三方庫

pipinstallpsutil

使用如下,假設進程號為3213

importpsutil
proc=psutil.Process(pid=3213)
printproce.name()
熱點內容
成績評選演算法 發布:2025-02-06 11:42:51 瀏覽:994
資料庫測試數據 發布:2025-02-06 11:31:05 瀏覽:821
球頭軸編程 發布:2025-02-06 11:29:36 瀏覽:280
為什麼安卓系統不能收縮許可權 發布:2025-02-06 11:27:58 瀏覽:730
演算法4視頻 發布:2025-02-06 11:19:20 瀏覽:933
51內置音效卡需要什麼主機配置 發布:2025-02-06 11:18:33 瀏覽:838
防針刺傷的物品配置有哪些 發布:2025-02-06 11:11:25 瀏覽:670
游戲數據反編譯 發布:2025-02-06 11:05:30 瀏覽:400
逍遙安卓在哪裡下載的視頻 發布:2025-02-06 10:50:42 瀏覽:877
上編程序 發布:2025-02-06 10:49:08 瀏覽:796