进程介绍
- 什么是进程
- 程序:例如pychram、QQ都是程序
- 进程:一个程序运行起来后,代码+用到的资源 称之为进程,它是操作系统分配资源的基本单元
- 不仅可以通过线程完成多任务,进程也是可以的
- 进程的状态
- 工作中,任务数往往大于cpu的核数,即一定有一些任务正在执行,而另外一些任务在等待cpu进行执行,因此导致了有了不同的状态
- 就绪状态:运行的条件都已经满足了,随时可以给操作系统调度执行
- 执行状态:cpu正在执行其功能
- 等待状态:等待某些条件满足,例如一个程序sleep了,此时就处于等待态
进程、线程对比
- 功能
- 进程,能够完成多任务,比如 在一台电脑上能够同时运行多个软件
- 线程,能够完成多任务,比如 一个QQ中的多个聊天窗口
- 定义不同
- 一个进程中可以包含若干个线程,它们可以利用进程所拥有的资源,在操作系统中,通常都是把进程作为分配资源的基本单位,而把线程作为独立运行和独立调度的基本单位,由于线程比进程更小,基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),故对它的调度所付出的开销就会小得多,能更高效的提高系统内多个程序间并发执行的程度
import os
"""
创建进程的参数:
target:指定进程执行的任务函数
name:设置进程名称
args:给任务函数传递参数(元组)
kwargs:给任务函数传递参数(字典)
daemon:是否设为守护进程
守护进程:主进程执行结束、子进程不管有没有执行完,都终止执行
进程对象的方法:
start():启动进程
join():设置主进程等待子进程执行的时间(默认等待执行完)
注意点:进程之间数据的独立的(不共享)
multiprocessing:
"""
from multiprocessing import Process
import time
def func1(name):
print('func1执行的进程ID{},父进程的ID:{}'.format(os.getpid(),os.getppid()))
for i in range(5):
print("{}------正在做事情1------".format(name))
time.sleep(1)
def func2(name):
print('func2执行的进程ID{},父进程的ID:{}'.format(os.getpid(),os.getppid()))
for i in range(6):
print("{}-----正在做事情2------".format(name))
time.sleep(1)
# # 创建进程
# p1 = Process(target=func1, args=('z1',))
# p2 = Process(target=func2, kwargs={'name': "z2"})
# # 启动进程
# p1.start()
# p2.start()
def run():
p1 = Process(target=func1, args=('z1',))
p2 = Process(target=func2, kwargs={'name': "z2"})
# 启动进程
p1.start()
p2.start()
if __name__ == '__main__':
# 创建进程
print('主进程的进程ID',os.getpid())
run()
进程间通信
Python multiprocessing.Queue() 和 queue.Queue区别
- Queue.Queue是进程内队列,同一个进行中多个线程之间通信用。
- multiprocess.Queue是跨进程通信队列。
进程中Queue的使用
- 可以使用multiprocessing模块的Queue实现多进程之间的数据传递,Queue本身是一个消息列队程序,首先用一个小实例来演示一下Queue的工作原理:在父进程中创建两个子进程,一个往Queue里写数据,一个从Queue里读数据:
- 注意点进程之间的queue要当做参数传进去(不共享全局变量)
注意点:进程中任务的参数和返回必须是一个可序列化的对象 pickle.dumps
import pickle
import unittest
a = unittest.TestResult()
res = pickle.dumps(a)
print(res)
PS:JoinableQueue(),进程中的队列模块,继承了进程中的Queue,拥有普通队列的taskdone()和join()方法