进程是分配资源的,线程是做事情的
开启一个进程会自动在该进程里面产生一个主线程
简单的多进程案例:
import multiprocessing
import time
def dance(dancer, age):
while 1:
time.sleep(1)
print("dancer:%s age:%s" % (dancer, age))
def song(singer, age):
for i in range(10)
time.sleep(1)
print("singer:%s age:%s" % (singer, age))
def main():
"""进程传参"""
# 创建一个跳舞的子进程
# 与线程相同
multiprocessing.Process(target=dance,args=("张飞",30)).start()
# 创建一个唱歌的子进程,这个子进程会提前结束,但是主进程还是会等待所有进程。
multiprocessing.Process(target=song,args=("关羽",35)).start()
if __name__ == '__main__':
main()
多进程之间无法共享数据:案例
import multiprocessing
import time
num = 0
def read():
while 1:
time.sleep(1)
print("read:", id(num))
print("read:", num)
def write():
global num
while 1:
time.sleep(1)
num += 1
print("write:", id(num))
print("write:", num)
def main():
multiprocessing.Process(target=read).start()
multiprocessing.Process(target=write).start()
if __name__ == '__main__':
main()
如果想要进程之间传递数据,我们需要使用队列
3个api:
存:queue.put()
取:queue.get()
存入数量:queue.qsize()
使用队列的方式共享数据:
代码运行前提是,在linux环境,win环境是无法执行的
结果:
import multiprocessing
import time
# 开启一个队列,用来存储写入数据
queue = multiprocessing.Queue(3)
def read():
while 1:
time.sleep(1)
# 从队列里面按照先进先出原则依次读取数据
num = queue.get()
print("read:", num)
def write():
for i in range(10):
time.sleep(1)
# 向队列中写入数据
queue.put("数据:%s" % i)
def main():
# 开启2个进程,一个进程写数据到队列中,一个进程从队列中读取数据
multiprocessing.Process(target=write).start()
multiprocessing.Process(target=read).start()
if __name__ == '__main__':
main()
队列解决了进程间的通讯
进程池
# 开一个进程池里面有三个进程,做10个复制的操作
# 复制函数
import multiprocessing
import time
def copy():
# 打印当前进程号
print("复制",multiprocessing.current_process().pid)
time.sleep(3)
def main():
"""复制内容"""
# 创建一个进程池
pool = multiprocessing.Pool(3)
# 加入任务
for temp in range(10):
# 加入任务
pool.apply_async(copy) # 如果使用了异步的进程池,那么主进程不会再等待
# 异步一定要写以下两步
# 不在加任何的进程
pool.close()
# 让主进程等待
pool.join()
if __name__ == '__main__':
main()
输出:(这样就只开启了3个进程,去循环处理10个事情)
如果我们使用了进程池,而不是使用队列,那么我们要怎么进行在进程池中共享数据呢:答案就是使用进程池队列
import multiprocessing
from multiprocessing import Manager
import time
def read(queue):
while True:
time.sleep(1)
print(queue.get())
def write(queue):
for temp in range(10):
time.sleep(1)
queue.put("数据%s"%temp)
# 进程执行的顺序也不一样
def main():
"""进程池的队列"""
# 进程池队列
queue = Manager().Queue()
# 进程池创建
pool = multiprocessing.Pool(2)
pool.apply(write,args=(queue,))
pool.apply(read,args=(queue,))
if __name__ == '__main__':
main()