python多任务之进程介绍

python进程介绍

进程
提到进程就需要说下程序,程序是指xx.py,是一个静态的文件。一个程序运行起来后,代码+用到的资源称之为进程,它是操作系统分配资源的基本单元。例如:qq程序运行后会产生一个qq的进程,qq程序运行两个后就会产生两个qq的进程。

进程和线程对比

先说一个简单的对比,qq程序运行后会产生一个qq进程,线程就是qq进程的多个聊天窗口。当一个进程运行时,会将源代码复制一份,而且所占的内存也会复制一份,然后独立运行。线程运行时,多个线程会在一个进程内运行,变量和内存都是共享的。由此可以看出进程运行所占的资源是高于线程,那么是不是说使用进程就是浪费资源?
举一个例子,比如一条流水线上生产一个东西,刚开始只有10个人,为了提升效率第一次可以再增加10个人,后面为了再增加效率是不是再增加人呢,流水线位置是有限的,人员工作量也是有限的,人数过多提升效率会有瓶颈,这时候提升效率就需要增加一条流水线了。流水线相当于进程,工人就先当于线程。
线程和进程在使用上各有优缺点:线程执行开销小,但不利于资源的管理和保护,而线程正相反。

进程demo

进程使用multiprocessor模块,其使用方式和线程差不多,都是先创建线程\进程对象,然后再启动

import multiprocessing
import time


def test1():
	for i in range(10):
		print("----- 1 -----")
		time.sleep(1)


def test2():
	for i in range(10):
		print("----- 2 -----")
		time.sleep(1)


def main():
	# 创建进程
	p1 = multiprocessing.Process(target=test1)
	p2 = multiprocessing.Process(target=test2)

	p1.start()
	p2.start()

if __name__ == '__main__':
	main()

执行效果可以看到函数test1和test2在同时执行
在这里插入图片描述

Queue列队进行进程中通信

由于python 进程和进程之间变量是不共享的,所以当进程之间要进行相互通讯时可以使用列队。列队是进程通信方式其中一种,使用put()和get()来传递和接收进程间的消息,存取的方式为,先存先取。

import multiprocessing
import time


def test1(q):
	for i in range(5):
		print("----- 1 -----")
		time.sleep(1)
		# 给消息列队传递参数
		q.put(i)


def test2(q):
	for i in range(5):
		print("----- 2 -----")
		time.sleep(1)
		# 接收消息列队传递参数
		q_msg = q.get()
		print(q_msg)

def main():
	# 创建消息列队
	q = multiprocessing.Queue()
	# 创建进程
	p1 = multiprocessing.Process(target=test1, args=(q,))
	p2 = multiprocessing.Process(target=test2, args=(q,))

	p1.start()
	p2.start()

if __name__ == '__main__':
	main()

执行效果可以看到test2可以接收到test1传递的参数
在这里插入图片描述

进程池pool

python进程池pool
假如一个程序需要使用到一万个进程,首先是代码需要去创建一万个进程会很麻烦,其次就是电脑的性能无法支持同时运行这么多进程,这时就需要使用到进程池。通过池去定义资源,所有需要创建的进程会按照池的大小进行排队,前面进程执行完成,轮到自己才会开始执行。

import os
import time
import random
import multiprocessing


def worker(msg):
	# 记录开始时间
	t_start = time.time()
	print("%s 开始执行,进程号为 %d" % (msg, os.getpid()))
	# 生成随机休眠时间
	time.sleep(random.random()*2)
	# 记录结束时间
	t_stop = time.time()
	print(msg, "执行完毕,耗时 %0.2f" % (t_stop - t_start))


def main():
	# 定义地址池,最大进程数为3
	po = multiprocessing.Pool(3)
	for i in range(10):
		# .apply_async(要调用的目标, (传递给目标的参数元组,))
		po.apply_async(worker, (i,))
	print("-----start-----")
	# 关闭进程池,关闭池后不在接收新的请求
	po.close()
	# 等待池中的所有子进程执行完成,必须放在close语句之后
	po.join()
	print("-----end-----")


if __name__ == '__main__':
	main()

执行效果可以看到进程池为3,同时只能执行3个进程,其余进程排队执行,进程池有一个特点,进程号不会改变。
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值