方法1 os.fork()

windows上不支持,mac,linux,unix上可以

import os  
pid = os.fork()  # 操作系统自动把父进程的信息资源复制给了子进程,在两个进程中分别返回,父进程返回子进程的ID
if pid < 0:
    print('fork失败')
elif pid == 0:  # 子进程的pid为 0
    print('我是子进程',os.getpid(),'我的父进程',os.getppid())  # os.getpid()获取当前进程的编号,os.getppid()获取当前进程的父进程的编号
else:
    print('我是父进程',os.getpid())

尝试用子进程改变全局变量

import os
# 尝试改变全局变量
num = 0
pid = os.fork()
if pid < 0:
    print('fork失败')
elif pid == 0:
    print('我是子进程',os.getpid(),'我的父进程',os.getppid())
    num += 1
    print(num)   # 结果:num = 1
else:
    print('我是父进程',os.getpid())
    num += 1
    print(num)    # 结果:num = 1

# 结论:子进程无法改变全局变量,因为子进程改变的是拷贝的父进程的num值

方法2 Process()

可以在多平台上创建子进程(包括windows)

from multiprocessing import Process
import os


def child_process_func(name):
    """
    当前函数是交给子进程实现
    :return:
    """
    print('当前执行的进程是子进程,进程编号是{},父进程编号是{},当前子进程的名字是{}'.format(os.getpid(),os.getppid(),name))


if __name__ == '__main__':
    # TODO 打印父进程ID
    print("父进程的ID", os.getpid())
    # TODO 创建子进程
    cp = Process(target=child_process_func,args=('子进程',)) # 元组只有一个元素时要加,target说明使用的方法/对象
    # def __init__(self, group=None, target=None, name=None, args=(), kwargs={}):       //agrs=(),打包成元组
    cp.start()
    print(cp.name,cp.pid) # 获取子进程的名字,进程名为1  获取子进程的pid

    # print('结束主进程')    # 子进程没结束,主进程就结束了

    cp.join()               # 等所有进程完成后,主进程才结束
    print('结束主进程')

在windows上执行有可能会出现下面情况,避其锋芒,我选择linux执行 😡

Process finished with exit code -1073741819 (0xC0000005)
Logo

更多推荐