1. 进程的状态
工作中,任务数往往大于cpu的核数,即一定有一些任务正在执行,而另外一些任务在等待cpu进行执行,因此导致了有了不同的状态
- 就绪态:运行的条件都已经慢去,正在等在cpu执行
- 执行态:cpu正在执行其功能
- 等待态:等待某些条件满足,例如一个程序sleep了,此时就处于等待态
2.多进程的使用
from multiprocessing import Process
p = Process(target=func, args=(x,)) # 创建进程 target=函数名 args=函数的参数
multiprocessing.current_process() # 查看当前执行的进程
multiprocessing.current_process().pid 查看当前执行的进程编号
os.getpid() # 进程编号
os.getppid() # 父进程编号
p.daemon = True # 主进程守护 主进程结束,程序结束
p.start() # 启动进程
p.terminate() # 不管任务是否完成,立即终止子进程
p.join() # 进程同步(一个进程执行任务完成 下个进程再执行任务)
3.多进程中全局变量是不能资源共享的
4.进程间通信-Queue
初始化Queue()对象时(例如:q=Queue()),若括号中没有指定最大可接收的消息数量,或数量为负值,那么就代表可接受的消息数量没有上限(直到内存的尽头);
-
Queue.qsize():返回当前队列包含的消息数量;
-
Queue.empty():如果队列为空,返回True,反之False ;
-
Queue.full():如果队列满了,返回True,反之False;
-
Queue.get([block[, timeout]]):获取队列中的一条消息,然后将其从列队中移除,block默认值为True;
1)如果block使用默认值,且没有设置timeout(单位秒),消息列队如果为空,此时程序将被阻塞(停在读取状态),直到从消息列队读到消息为止,如果设置了timeout,则会等待timeout秒,若还没读取到任何消息,则抛出"Queue.Empty"异常;
2)如果block值为False,消息列队如果为空,则会立刻抛出"Queue.Empty"异常;
-
Queue.get_nowait():相当Queue.get(False);
-
Queue.put(item,[block[, timeout]]):将item消息写入队列,block默认值为True;
1)如果block使用默认值,且没有设置timeout(单位秒),消息列队如果已经没有空间可写入,此时程序将被阻塞(停在写入状态),直到从消息列队腾出空间为止,如果设置了timeout,则会等待timeout秒,若还没空间,则抛出"Queue.Full"异常;
2)如果block值为False,消息列队如果没有空间可写入,则会立刻抛出"Queue.Full"异常;
- Queue.put_nowait(item):相当Queue.put(item, False)
import multiprocessing
# 任务1
def write(queue):
for i in range(10):
# 判断容量是否满了
if queue.full():
print("满了")
break
print("write:", i)
queue.put(i)
# 任务2
def read(queue):
for i in range(10):
# 判断如果容量空了
if queue.empty():
print("空了")
break
print("read:", queue.get())
if __name__ == '__main__':
# 创建消息队列
# 注意 在linux系统可以写在上面 但是windows是不可以的
queue = multiprocessing.Queue(5)
# 创建进程 -> 新建状态
write_process = multiprocessing.Process(target=write, args=(queue,))
read_process = multiprocessing.Process(target=read, args=(queue,))
# 启动进程 就绪状态
write_process.start()
# 进程同步
write_process.join()
read_process.start()
5.进程池Pool
multiprocessing.Pool常用函数解析:
- apply_async(func[, args[, kwds]]) :使用非阻塞方式调用func(并行执行,堵塞方式必须等待上一个进程退出才能执行下一个进程),args为传递给func的参数列表,kwds为传递给func的关键字参数列表;
- close():关闭Pool,使其不再接受新的任务;
- terminate():不管任务是否完成,立即终止;
- join():主进程阻塞,等待子进程的退出, 必须在close或terminate之后使用;
import multiprocessing, time
# 复制任务
def copy_work():
print(multiprocessing.current_process().pid)
print("正在复制...")
time.sleep(0.1)
if __name__ == '__main__':
# 创建进程池
# Pool(进程数量)
pool = multiprocessing.Pool(3)
for i in range(10):
# 使用进程池中的进程执行任务
pool.apply_async(copy_work)
# 固定用法(在主进程等待前 需要关闭进程池 不再接收新的任务)
pool.close()
# 保证主进程堵塞(等待)
pool.join()