网站首页 > 技术文章 正文
python也可以并发编程,常见实现方式有3种:进程、线程、协程,这一篇我们说说在linux操作系统下python怎么创建进程。
进程创建后一般有两种执行方式,一种是与父进程共享代码继续执行新的逻辑,另一种是载入新的程序。
第一种我们只需要调用os.fork就行,这样就能把父进程与子进程的执行流分开了。
第二种我们首先调用os.fork创建子进程,然后再根据需要调用os.exec*类中的一个函数载入新的程序,这个新的程序不一定是用python写的。
假设每个进程需要打印出自己的id,下面让我们分别看下这两种方式。
一、只调用os.fork
os.fork在父进程和子进程中都有返回值,在父进程返回值有两种情况,如果成功创建子进程则返回新创建子进程的id,如果创建子进程失败则抛出OSError异常,在子进程返回值始终是0。
如下代码创建两个子进程然后每个子进程打印出自己id:
Bash
import sys
import os
# 用来存放子进程id
subprocess = set()
# 需要创建的子进程数
subcount = 2
for i in range(0, 2):
try:
ret = os.fork()
except OSError as e:
print("fork occurs error: %s"%(str(e)))
if ret == 0:
print("my process id is: %d" % (os.getpid(),))
sys.exit(0)
else:
subprocess.add(ret)
# 等待所有子进程结束
while subprocess:
try:
pid, exit_status = os.waitpid(-1, 0)
except OSError as e:
print("waitpid occurs error: %s" %(str(e)))
sys.exit(-1)
subprocess.remove(pid)
运行后在我的机器上输出如下信息:
Bash
my process id is: 4828
my process id is: 4829
在你的机器上也会输出类似的信息,但进程id一般不会与我的相同。
二、os.fork 与 os.execl 一块使用
由于 os.execl 调用需要载入一个新的程序,我们需要先编写这个程序。这个程序我们仍然用python来写,当然你也可以选择用其他语言编写。
我们新建一个文件,命名为print_pid.py并增加可执行权限,内容如下:
#!/usr/bin/env python3
import os
import sys
print("my process id is: %d" % (os.getpid(),))
sys.exit(0)
下面开始编写载入新程序print_pid.py的代码,内容如下:
import sys
import os
# 用来存放子进程id
subprocess = set()
# 需要创建的子进程数
subcount = 2
for i in range(0, 2):
try:
ret = os.fork()
except OSError as e:
print("fork occurs error: %s"%(str(e)))
if ret == 0:
# 载入新的程序
os.execl("print_pid.py","print_pid.py")
else:
subprocess.add(ret)
# 等待所有子进程结束
while subprocess:
try:
pid, exit_status = os.waitpid(-1, 0)
except OSError as e:
print("waitpid occurs error: %s" %(str(e)))
sys.exit(-1)
subprocess.remove(pid)
运行后输出以下信息:
my process id is: 4997
my process id is: 4998
三、两种方式对比
第一种方式只调用了fork,适合父进程与子进程共享同一份程序代码的场景。
第二种方式除了调用fork还调用了exec*类函数用来载入新的程序,适合父进程与子进程代码是分开的场景。
猜你喜欢
- 2024-12-18 接口测试系列文章3——Python接口测试其实只需三步
- 2024-12-18 Python列表详解 python中列表的方法
- 2024-12-18 Python3+pygame实现的90坦克大战代码有演示效果
- 2024-12-18 小白都看懂了,Python 中的线程和进程精讲,建议收藏
- 2024-12-18 pandas每天一题-题目1、2、3 pandas选择题题库
- 2024-12-18 二分查找法-Python学习 二分查找算法流程图
- 2024-12-18 Python3.8+Django+nginx+uwsgi环境(二)
- 2024-12-18 一篇文章带你使用Python搞定对Excel表的读写和处理
- 2024-12-18 py2exe实现python文件打包为.exe可执行程序(上篇)
- 2024-12-18 PyPy三重发行版:支持python2.7、3.6和3.7
- 06-24Python调用Docker API的使用方式(pycharm docker 调试)
- 06-24青少年Python编程系列28:Python中函数的递归调用
- 06-24python调用sqlite数据库案例(python 调用数据库)
- 06-24【Python机器学习系列】基于Flask来构建API调用机器学习模型服务
- 06-24通过pybind11来实现python调用C++接口(一)
- 06-24Python编程调用Deepseek API创建智能体
- 06-24python多装饰器针对函数、类、方法的调用顺序说明
- 06-24Python Qt GUI设计:Python调用UI文件的两种方法(基础篇—3)
- 270℃Python短文,Python中的嵌套条件语句(六)
- 268℃python笔记:for循环嵌套。end=""的作用,图形打印
- 266℃PythonNet:实现Python与.Net代码相互调用!
- 262℃Python实现字符串小写转大写并写入文件
- 261℃Python操作Sqlserver数据库(多库同时异步执行:增删改查)
- 121℃原来2025是完美的平方年,一起探索六种平方的算吧
- 101℃Python 和 JavaScript 终于联姻了!PythonMonkey 要火?
- 95℃Ollama v0.4.5-v0.4.7 更新集合:Ollama Python 库改进、新模型支持
- 最近发表
-
- Python调用Docker API的使用方式(pycharm docker 调试)
- 青少年Python编程系列28:Python中函数的递归调用
- python调用sqlite数据库案例(python 调用数据库)
- 【Python机器学习系列】基于Flask来构建API调用机器学习模型服务
- 通过pybind11来实现python调用C++接口(一)
- Python编程调用Deepseek API创建智能体
- python多装饰器针对函数、类、方法的调用顺序说明
- Python Qt GUI设计:Python调用UI文件的两种方法(基础篇—3)
- Python | Django 外部脚本调用 models 数据库
- 自学Python第九天——操作列表(python操作步骤)
- 标签列表
-
- python中类 (31)
- python 迭代 (34)
- python 小写 (35)
- python怎么输出 (33)
- python 日志 (35)
- python语音 (31)
- python 工程师 (34)
- python3 安装 (31)
- python音乐 (31)
- 安卓 python (32)
- python 小游戏 (32)
- python 安卓 (31)
- python聚类 (34)
- python向量 (31)
- python大全 (31)
- python次方 (33)
- python桌面 (32)
- python总结 (34)
- python浏览器 (32)
- python 请求 (32)
- python 前端 (32)
- python验证码 (33)
- python 题目 (32)
- python 文件写 (33)
- python中的用法 (32)