1.fork函数
此处需要注意的是
当调用fork方法 ,之后的代码会运行两次
os 中的fork只能在liunx中使用
fork方法有一个返回值。若为0表示子进程
获取子进程的编号 os.getpid 获取父进程的编号
实例:
"""
os 中的fork只能在liunx中使用
"""
import os
print("daima")
# 运行一个子进程
# 当调用fork方法 ,之后的代码会运行两次
re = os.fork()
print("res = ",re)
# fork方法有一个返回值。若为0表示子进程
if re == 0:
# 获取子进程的编号 os.getpid 获取父进程的编号os.getppid
print("子",os.getpid(),os.getppid())
else:
print("主",os.getpid())
print("代码完成")
======================================================
os.fork()
os.getpid()
os.getppid()
2.全局变量问题
全局变量不共享,进程独自占有一份
实例:
import os
num = 10
def sum1():
print("111")
global num
num += 10
print("unm")
def sum2():
print("22222")
global num
num += 10
print(num)
res = os.fork()
if res == 0:
print("子进程运行")
sum1()
else:
print("主进程运行")
sum2()
print("程序运行结束")
3.多个fork问题
遇见fork将一个进程开辟成两个
实例
import os
res = os.fork()
if res == 0:
print("1")
else:
print("2")
res2 = os.fork()
if res2 == 0:
print("3")
else:
print("4")
print("程序运行结束")
运行结果
image.png
4.window环境下使用multiprocessing
我们使用os.fork()方法实现了多进程,但是这种方案只能在Linux下运行,window环境下是无法运行的,那么有没有可以实现在任何平台都能运行的多进程了,有!Python为大家提供了multiprocessing模块用来实现多进程。
multiprocessing模块实例:
主进程不变,创建子进程
from multiprocessing import Process
import time
import os
def download(path):
print("开始下载")
for x in range(5):
print("%s开始下载中……" %path)
print(os.getpid())
print(os.getppid())
time.sleep(1)
print("下载结束")
def printMsg(msg):
print("开始打印")
for x in range(5):
print("打印中……%s" % msg)
print(os.getpid())
print(os.getppid())
time.sleep(1)
print("打印结束")
if __name__ == '__main__':
start_time = time.time()
print("程序开始运行了")
# download("www.xxx.com")
# 多进程
# 构建进程对象
t1 = Process(target=download, args=("www.xxx.com",), name="download")
# 启动进程
t1.start()
# 构建进程对象
t2 = Process(target=printMsg, args=("刘建宏真帅,今天天气真热!!",), name="print")
# 启动进程
t2.start()
print("程序结束", time.time() - start_time)
运行结果
image.png5.多进程中常见方法
启动进程
t1.start()
守护进程放在start之前 ,把这个进程注册成守护进行
守护进程依赖于主进程存活,主进程结束守护进程结束
t1.daemon = True
获取进程名称.在多进程中,子进程名字默认是Process - n
print(t1.name)
判断进程是否被杀死
if t1.is_alive():
print(t1.is_alive())
杀死进程
t1.terminate()
进程对象的join方法,使主进程等待当前子进程运行结束后再进行运行
t1.join()
综合实例:
def run(msg):
for x in range(10):
print("一个子进程")
print(msg)
print("子进程结束")
time.sleep(1)
if __name__ == '__main__':
print("主进程开始")
t1 = Process(target=run, args="1", name="zi")
t2 = Process(target=run, args="2", name="zi1")
# 守护进程放在start之前 ,把这个进程注册成守护进行
# 守护进程依赖于主进程存活,主进程结束守护进程结束
t1.daemon = True
# 启动进程
t1.start()
t2.start()
# 获取进程名称
# 在多进程中,子进程名字默认是Process - n
print(t1.name)
print(t2.name)
# 判断进程是否被杀死
if t1.is_alive():
print(t1.is_alive())
# 杀死进程
t1.terminate()
# 进程对象的join方法,使主进程等待当前
# 子进程运行结束后再进行运行
t1.join()
print("zhu")
6.进程类
进程的实现:
1.需要基础multiprocessing模块中Process类
2.重写run方法,run方法就是我们要执行的方法
from multiprocessing import Process
import time
"""
进程的实现:
1.需要基础multiprocessing模块中Process类
2.重写run方法,run方法就是我们要执行的方法
"""
class MyProcess(Process):
def __init__(self, name, age):
# 第一个参数是进程的名字不能写成普通参数,固定写法
super().__init__(name=name)
self.age = age
# RUN方法就是进程需要的执行的方法
def run(self):
print("独立子进程")
time.sleep(1)
print("子进程结束")
if __name__ == '__main__':
print("主进程开始")
m1 = MyProcess("1", "2")
m1.start()
print("主进程结束")
网友评论