什么是进程

(如果你有一定的基础,可以跳过这一part)

在了解进程之前,我们需要先知道什么是多任务。多任务顾名思义,就是指操作系统可以执行多个任务。比如使用Windows操作系统我们可以同时聊天,看视频,上网浏览网页等。此时,操作系统就是在执行多任务,而每一个任务就是一个进程。Windows下我们同时按住ESC+Shift+Ctrl可以打开任务管理器,里面显示着现在正在执行的进程

PYTHON windows设置进程名 windows python多进程_多进程

进程(process)是计算机中已运行的程序实体。进程与程序不同,程序本身只是命令、数据及其组织形式的描述,进程才是程序真正的运行实例。比如说我们在打开两个QQ的时候,我们创建了同一个程序的两个进程

Python创建进程的常用方式

Python提供了多个模块用于创建进程。比如os.fork()(适用于Linux/Unix/Mac),和multiprocessing模块和Pool进程池。

使用multiprocessing模块创建进程

multiprocessing模块提供了一个Process类来代表一个进程对象,语法如下:

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

使用[]的为可选参数
参数说明:
group:参数未使用,值始终未None
target:表示当前进程启动时执行的可调用对象
name:为当前进程赋予别名
args:表示传递给target的参数元组
kwargs:表示传递给target函数的参数字典

实例
from multiprocessing import Process

# 子进程代码
def test(interval):
    print("我是子进程")


# 执行主进程
def main():
    print("主进程开始")
    p = Process(target=test, args=(1,))
    p.start()
    print("主进程结束")

if __name__ == '__main__':
    main()

代码分析:
上述代码先实例化Process类,然后使用p.start()方法启动子进程,开始执行test()函数。
Process的实例有如下常用方法:
start():启动进程实例
is_alive():判断进程实例是否还在执行。
join([timeout]):线程同步,即主线程任务结束之后,进入阻塞状态,一直等待其他的子线程执行结束之后,主线程再终止
run():r如果没有给定target参数,对这个对象调用start()的时候,就将执行对象中的run()方法

Process类还有如下常用属性:
name:当前进程实例别名,默认为Process-N,N为从1开始递增的整数
pid:当前进程实例的PID值

实例2演示Process类的方法和属性的使用

创建2个子进程,分别使用os模块和time模块输出父进程和子进程的ID以及紫禁城的时间,并且调用Process类的name和pid属性,代码如下:

from multiprocessing import Process
import time
import os


# 两个子进程会调用的两个方法
def child_1(interval):
    print("子进程(%s)开始执行,父进程为(%s)" % (os.getpid(), os.getppid()))
    t_start = time.time()  # 计时开始
    time.sleep(interval)  # 程序将会被挂起interval秒
    t_end = time.time()
    print("子进程(%s)执行时间为'0.2f'秒" % (os.getpid()), t_end - t_start)


def child_2(interval):
    print("子进程(%s)开始执行,父进程为(%s)" % (os.getpid(), os.getppid()))
    t_start = time.time()  # 计时开始
    time.sleep(interval)  # 程序将会被挂起interval秒
    t_end = time.time()
    print("子进程(%s)执行时间为'0.2f'秒" % (os.getpid()), t_end - t_start)


if __name__ == '__main__':
    print("----------父进程开始执行---------")
    print("父进程PID:%s" % os.getpid())
    p1 = Process(target=child_1, args=(1,))
    p2 = Process(target=child_2, name="python", args=(2,))
    p1.start()
    p2.start()
    # 同时父进程仍然往下执行,如果P2进程还在执行,将会返回True
    print("p1.is_alive=%s" % p1.is_alive())
    print("p2.is_alive=%s" % p2.is_alive())
    # 输入p1和p2进程的别名和PID
    print("p1.name=%s" % p1.name)
    print("p1.pid=%s" % p1.pid)
    print("p2.name=%s" % p2.name)
    print("p2.pid=%s" % p2.pid)
    print("------等待子进程----------")
    p1.join()
    p2.join()
    print("---------父进程执行结束--------")

上述代码中,第一次实例化Process类的时候,会为name属性默认赋值为Process-1,第二次则默认为Process-2,但是由于在实例化进程p2的时候,设置了name属性为python,所以p2.name的值为python而不是Process-2