目录:
一、进程的状态
二、进程的创建
三、进程间通信
四、进程池
Python并发之多进程
一、进程的状态
工作中,任务数往往大于cpu的核数,即一定有一些任务正在执行,而另外一些任务在等待cpu进行执行,因此导致了有了不同的状态:
- 就绪态:运行的条件都已经满足,正在等在cpu执行。
- 执行态:cpu正在执行该进程。
- 等待态:等待某些条件满足,例如一个程序sleep了,此时就处于等待态。
二、进程的创建
import multiprocessing
import time
import os
def run(name):
time.sleep(2)
print("进程{}启动...".format(name))
print("进程{} ID:{}".format(name, os.getpid()))
print("进程父ID:{}".format(os.getppid()))
if __name__ == '__main__':
p1 = multiprocessing.Process(target=run, args=("p1",))
p2 = multiprocessing.Process(target=run, args=("p2",))
p1.start()
p2.start()
p1.join() # 等待进程p1执行完毕
p2.join() # 等待进程p2执行完毕
print("All processes finished...")
print("主进程ID:{}".format(os.getpid()))
运行结果
三、进程间通信
1.Queue队列
示例:
from multiprocessing import Process, Queue
q = Queue(10)
def producer(q):
print(id(q))
for i in range(100000):
q.put(i)
def consumer(q):
print(id(q))
for i in range(100000):
data = q.get()
print(data)
if __name__ == "__main__":
p = Process(target=producer, args=(q,))
c = Process(target=consumer, args=(q,))
p.start()
c.start()
四、进程池
示例:
from concurrent.futures import ProcessPoolExecutor
import os
import time
def task(n):
print('进程ID:%s is running...' % os.getpid())
time.sleep(2)
return n**2
if __name__ == '__main__':
p = ProcessPoolExecutor() # 不填则默认为CPU的个数
l = []
t0 = time.time()
for i in range(20):
obj = p.submit(task, i) # submit()方法返回的是一个future实例,要得到结果需要用obj.result()
l.append(obj)
p.shutdown() # 类似用from multiprocessing import Pool实现进程池中的close及join一起的作用
print([obj.result() for obj in l])
ts = time.time()
print("耗时:", ts - t0)
运行结果
网友评论