python高级:进程。

一、 进程的创建。

1.1 MAC和Linux下:

import multiprocessing
def printf(name,age):
    print(name,age)

#进程的创建
process1 = multiprocessing.Process(target=printf,args=('黎明',),kwargs={'age':20})
#进程的调用
process1.start()

在mac和Linux下,主进程的代码,在创建子进程的时候,不会由子进程拷贝。

1.2 Windows下:

import multiprocessing
def printf(name,age):
    print(name,age)

if __name__ == '__main__':
    #进程的创建
    process1 = multiprocessing.Process(target=printf,args=('黎明',),kwargs={'age':20})
    #进程的调用
    process1.start()

Windows下,if name == ‘main’: 可以保证再导入该文件时,以下代码不执行,同时确保子进程在创建时,不会拷贝内部代码。

1.3 关于Process的说明:

Process([group [, target [, name [, args [, kwargs]]]]])

group:指定进程组,目前只能使用None
target:执行的目标任务名
name:当前进程的别名,默认为Process-N,N为从1开始递增的整数
args:以元组方式给执行任务传参
kwargs:以字典方式给执行任务传参
Process创建的实例对象的常用方法:

start():启动子进程实例(创建子进程)
join():等待子进程执行结束
terminate():不管任务是否完成,立即终止子进程
Process创建的实例对象的常用属性:

二、获取进程编号

获取当前进程编号: os.getpid()

获取当前父进程编号: os.getppid()

获取进程编号可以查看父子进程的关系。

三、进程的注意点

3.1 进程之间不共享全局变量

创建子进程会对主进程资源进行拷贝,之所以进程之间不共享全局变量,是因为操作的不是同一个进程里面的全局变量,只不过不同进程里面的全局变量名字相同而已。

import multiprocessing
import time

# 定义全局变量
g_list = list()


# 添加数据的任务
def add_data():
    for i in range(5):
        g_list.append(i)
        print("add:", i)
        time.sleep(0.2)

    # 代码执行到此,说明数据添加完成
    print("add_data:", g_list)


def read_data():
    print("read_data", g_list)


if __name__ == '__main__':
    # 创建添加数据的子进程
    add_data_process = multiprocessing.Process(target=add_data)
    # 创建读取数据的子进程
    read_data_process = multiprocessing.Process(target=read_data)

    # 启动子进程执行对应的任务
    add_data_process.start()
    # 主进程等待添加数据的子进程执行完成以后程序再继续往下执行,读取数据
    add_data_process.join()
    read_data_process.start()

    print("main:", g_list)

    # 总结: 多进程之间不共享全局变量

结果:

add: 0
add: 1
add: 2
add: 3
add: 4
add_data: [0, 1, 2, 3, 4]
main: []
read_data []

在这里插入图片描述

3.2 主进程会等待所有的子进程执行结束再结束。

不让主进程再等待子进程去执行完的两种方法:
(1)设置守护主进程方式: 子进程对象.daemon = True
(2)销毁子进程方式: 子进程对象.terminate()

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值