(笔记整理)python多进程

进程是分配资源的,线程是做事情的
开启一个进程会自动在该进程里面产生一个主线程

简单的多进程案例:

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()
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值