【ZZ】python中使用fork创建新的进程

本文介绍了如何在Python中利用os模块的fork方法创建新进程,并通过实例演示了父进程与子进程的区别及如何利用PID区分它们。同时,还探讨了fork方法的工作原理及其在守护进程创建中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

python中如果要创建新进程的话,可以使用os模块中的fork方法。为了了解其中工作原理,笔者结合linux的查看进程ps命令,对这个方法做了一些测试。

python运行时进程

python一开始运行的时候,系统会生成一个新的进程。先看下面代码:

#!/usr/bin/env python 
#coding=utf8    
from time import sleep 
sleep(30)

因为代码执行完后,进程就会被销毁,所以这里睡眠30秒,方便看到效果。在linux下执行这个代码:

python hello.py &

加上&符号,可以让程序在后台运行,不会占用终端。输入ps -l命令查看进程,在电脑上输出如下:

 

                        python运行时进程

其中第二条记录就是刚才运行的python了

使用fork来创建一个新进程

使用fork创建一个新进程成功后,新进程会是原进程的子进程,原进程称为父进程。如果发生错误,则会抛出OSError异常。

#!/usr/bin/env python 
#coding=utf8 
from time import sleep 
import os 
try: 
    pid = os.fork() 
except OSError, e: 
    pass 
sleep(30)

 

运行代码,查看进程,在电脑上输出如下:

python中fork进程

可以看出第二条python进程就是第一条的子进程。

 

fork进程后的程序流程

使用fork创建子进程后,子进程会复制父进程的数据信息,而后程序就分两个进程继续运行后面的程序,这也是fork(分叉)名字的含义了。在子进程内,这个方法会返回0;在父进程内,这个方法会返回子进程的编号PID。可以使用PID来区分两个进程:

#!/usr/bin/env python
#-*- coding: utf-8 -*-
import os
from time import sleep
def my_fork():
	source = 10
	try:
		child_pid = os.fork()
		print "child_pid is:", child_pid
		if child_pid == 0:
			print "Child Process: PID# %s" %os.getpid()
			source = source - 1
			print "source in Child Process is %s" %source
			sleep(3)
			print "source in Child Process is %s" %source
		else:
			print "Parent Process: PID# %s" %os.getpid()
			print "source in Parent Process is %s" %source
		print "source is %s" %source
		sleep(30)
	except:
		pass

if __name__ == "__main__":
	my_fork()

 

上面代码中,在子进程创建前,声明了一个变量source,然后在子进程中自减1,最后打印出source的值,显然父进程打印出来的值应该为10,子进程打印出来的值应该为9。为了明显区分父进程和子进程,让子进程睡3秒,就看的比较明显了。

既然子进程是父进程创建的,那么父进程退出之后,子进程会怎么样呢?此时,子进程会被PID为1的进程接管,就是init进程了。这样子进程就不会受终端退出影响了,使用这个特性就可以创建在后台执行的程序,俗称守护进程(daemon)。

 

转载于:https://my.oschina.net/u/1178546/blog/152577

[root@xran-cudu0808-0 scripts]# ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.0 4996 1684 ? Ss 01:24 0:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep infinity root 7 0.0 0.0 6848 2996 pts/0 Ss 02:18 0:00 bash root 26 0.0 0.0 6848 2772 pts/1 Ss+ 02:18 0:00 bash root 44 0.0 0.0 6848 2992 pts/2 Ss+ 02:18 0:00 bash root 293 0.0 0.0 0 0 pts/0 Z< 02:21 0:00 [odsNameServer] <defunct> root 296 0.2 0.0 0 0 pts/0 Z< 02:21 0:05 [xranOamCtrl] <defunct> root 300 0.0 0.0 0 0 pts/0 Z 02:21 0:00 [python3] <defunct> root 317 0.0 0.0 0 0 pts/0 Z< 02:21 0:00 [pmon.sh] <defunct> root 390 0.1 0.0 0 0 pts/0 Z 02:21 0:02 [xranUpCtrl] <defunct> root 398 0.0 0.0 0 0 pts/0 Z< 02:21 0:01 [xranGnbCtrl] <defunct> root 407 0.0 0.0 0 0 pts/0 Z< 02:21 0:01 [xranCellCtrl] <defunct> root 452 0.0 0.0 0 0 pts/0 Z< 02:22 0:00 [xranProxyCtrl] <defunct> root 459 0.1 0.0 0 0 pts/0 Z 02:22 0:02 [xranDuCtrl] <defunct> root 1808 0.0 0.0 0 0 pts/0 Z< 02:25 0:00 [sleep] <defunct> root 2059 0.0 0.0 0 0 pts/0 Z< 02:34 0:00 [odsNameServer] <defunct> root 2062 0.4 0.0 0 0 pts/0 Z< 02:34 0:04 [xranOamCtrl] <defunct> root 2066 0.0 0.0 0 0 pts/0 Z 02:34 0:00 [python3] <defunct> root 2083 0.0 0.0 0 0 pts/0 Z< 02:34 0:00 [pmon.sh] <defunct> root 2156 0.2 0.0 0 0 pts/0 Z 02:34 0:02 [xranUpCtrl] <defunct> root 2164 0.1 0.0 0 0 pts/0 Z< 02:34 0:01 [xranGnbCtrl] <defunct> root 2173 0.1 0.0 0 0 pts/0 Z< 02:34 0:01 [xranCellCtrl] <defunct> root 2218 0.0 0.0 0 0 pts/0 Z< 02:34 0:00 [xranProxyCtrl] <defunct> root 2225 0.3 0.0 0 0 pts/0 Z 02:34 0:03 [xranDuCtrl] <defunct> root 4608 0.0 0.0 0 0 pts/0 Z< 02:38 0:00 [sleep] <defunct> root 4869 0.1 0.0 0 0 pts/0 Z< 02:38 0:00 [odsNameServer] <defunct> root 4872 0.6 0.0 0 0 pts/0 Z< 02:38 0:05 [xranOamCtrl] <defunct> root 4876 0.1 0.0 58972 47248 pts/0 S 02:38 0:00 python3 manage.py runserver -h 0.0.0.0 -p 8400 root 4893 0.2 0.0 0 0 pts/0 Z< 02:38 0:01 [pmon.sh] <defunct> root 4961 1.0 0.0 0 0 pts/0 Z 02:38 0:08 [xranUpCtrl] <defunct> root 4974 0.2 0.0 0 0 pts/0 Z< 02:39 0:02 [xranGnbCtrl] <defunct> root 4983 0.3 0.0 0 0 pts/0 Z< 02:39 0:02 [xranCellCtrl] <defunct> root 5028 0.0 0.0 0 0 pts/0 Z< 02:39 0:00 [xranProxyCtrl] <defunct> root 5035 1.5 0.0 0 0 pts/0 Z 02:39 0:12 [xranDuCtrl] <defunct> root 17783 0.0 0.0 0 0 pts/0 Z< 02:52 0:00 [sleep] <defunct> root 17789 0.0 0.0 11536 3068 pts/0 R+ 02:52 0:00 ps aux [root@xran-cudu0808-0 scripts]# cat kill.sh #!/bin/bash # 查找所有以 cmcc 开头的进程,排除 grep 进程 processes=$(ps aux | grep '[x]ran' | awk '{print $2}') # 如果找到进程 if [ -n "$processes" ]; then echo "找到以下以 XRAN 开头的进程,正在终止它们:" echo "$processes" # 遍历进程ID并杀死每个进程 for pid in $processes; do kill -9 $pid echo "已终止进程: $pid" done else echo "没有找到以 xran 开头的进程。" fi [root@xran-cudu0808-0 scripts]#
08-13
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值