创建一个进程需要使用multiprocessing模块的Process方法
使用方法:p1 = Process(target=func)
p1就是进程的对象,func就是进程启动是执行的任务;
在定义任务时也可以向任务中传参,通过Process方法中的args和kwagrs参数为任务中传递参数;
进程对象常用的几种方法:
start() 启动进程,当启动多个进程时为并行;
run() 启动进程,当启动多个任务时为串行,执行完上一个任务再执行下一个任务;
terminate() 终止进程,进程未执行完也终止,但是不释放进程占用的资源;
is_alive() 判断进程是否存活,True为存活,False为结束;
join() 加入,阻塞主进程后面的代码不执行,当对应的子进程执行完毕后再执行
close() 用于释放进程占用的资源,当进程在运行是,不可释放,将会报错,可以与terminate配合使用
代码示例
# encoding: utf-8
"""
进程
线程
协程
进程的多少与服务器的硬件配置相关,需要从cpu中分配资源
"""
from multiprocessing import Process
import time
import os
"""
创建进程示例
from multiprocessing import Process
p = Process(target=callable, args=(c1, c2, c3, ), kwagrs='')
p.start() # 启动进程
主进程:执行的时候,默认的进程称为主进程
子进程:在主进程中可以开启子进程
进程中的全局变量,在每个子进程中都有一份全局变量,各自操作各自进程中的全局变量,子进程之间互不影响
阻塞主进程后面代码
p1.join() # p1为子进程对象
"""
number = 100
def program():
global number
for i in range(5):
print("第{}行代码".format(i), os.getpid(), os.getppid())
time.sleep(0.5)
number -= 10
print("program中的number:", number)
def listen_music():
global number
musics = ["《全球》", "《qq》", "《全球2》", "《全球3》"]
for i in musics:
print("正在听{}".format(i), os.getpid(), os.getppid())
time.sleep(0.5)
number -= 20
print("listen_music中的number:", number)
def look_book(book):
global number
for i in range(5):
print("正在看书《{}》的第{}页".format(book, i),os.getpid(), os.getppid())
time.sleep(0.5)
number -= 30
print("look_book中的number:", number)
if __name__ == '__main__':
print("当前py文件进程号{} 以及父进程号{}".format(os.getpid(), os.getppid()))
p1 = Process(target=program) # 通过Process创建一个进程对象
p2 = Process(target=listen_music)
p3 = Process(target=look_book, args=("西游记", )) # 在创建一个进程时指定执行的函数,并传递参数
p1.start()
p2.start()
p3.start()
# p1.run() # 使用run时仅仅是运行这个进程,并且是串行,不会去cpu中分配新的资源
# p2.run()
# p3.run()
# p1.terminate() # 终止进程,进程未执行完也终止,但是不释放进程占用的资源
# print(p1.is_alive()) # 判断进程是否存活,True为存活,False为结束
# join() 加入,阻塞主进程后面的代码不执行,当对应的子进程执行完成后再执行
p1.join()
p2.join()
p3.join()
print("main中的number:", number)
# p1.close() # 用于释放进程占用的资源,当进程在运行是,不可释放,将会报错,可以与terminate配合使用
# p2.close()
进程池
pool = Pool(5) 初始化进程池,设置进程池中最多只能有五个进程
apply_async() 非阻塞式,同时进程进程池中的进程
apply() 阻塞式,当执行 完上一个进程时才进行下一个进程
from multiprocessing import Process, Pool
import time
import os
"""
进程池:
Pool
阻塞式:apply()
非阻塞式:apply_async()
"""
def task1():
print("this is task1", os.getpid(), os.getppid())
return "task2"
def task2(msg):
print("this is :", msg, os.getpid(), os.getppid())
if __name__ == '__main__':
print("当前py文件进程号{} 以及父进程号{}".format(os.getpid(), os.getppid()))
pool = Pool(4) # 创建进程池
# 非阻塞式,会同时进行进程池中的进程,如进程池中配置为四个进程,将会先添加四个进程到进程池中同时进行
for i in range(10):
pool.apply_async(task1, callback=task2)
print("------------------------>", i)
pool.close()
pool.join() # 阻塞进程池,只有执行完进程池中的所有进程才会执行主进程后面的代码
print("main, over")