多进程知识点总结1

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("程序运行结束")

运行结果


多进程知识点总结1_第1张图片
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)

运行结果

多进程知识点总结1_第2张图片
image.png
5.多进程中常见方法

启动进程

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("主进程结束")

你可能感兴趣的:(多进程知识点总结1)