05-使用进程实现多任务
1.什么是进程以及实现多任务的原理
进程是资源分配的单位,我们双击一个程序,它运行之后就叫做进程,在运行之前还是代码。
进程包含代码、网络、键盘、鼠标等资源。
使用多进程实现多任务实际上就是把一份资源进行复制,然后在利用,这样,我们很容易看出多进程的缺点(占用资源太大)。
代码执行过程中出现堵塞的现象,进程才会显现应有的作用
2.代码实现简单的多进程
1 import multiprocessing 2 import time 3 4 5 def sing(): 6 for i in range(5): 7 print("正在唱歌") 8 time.sleep(0.1) 9 10 11 def dance(): 12 for i in range(5): 13 print("正在跳舞") 14 time.sleep(0.1) 15 16 17 def main(): 18 p1 = multiprocessing.Process(target = sing) 19 p2 = multiprocessing.Process(target = dance) 20 p1.start() 21 p2.start() 22 23 24 if __name__ == "__main__": 25 main()View Code
3.使用队列完成进程间通信
概念介绍
Queue([maxsize]) 创建共享的进程队列。 参数 :maxsize是队列中允许的最大项数。如果省略此参数,则无大小限制。
基本语法
Queue([maxsize]) 创建共享的进程队列。maxsize是队列中允许的最大项数。如果省略此参数,则无大小限制。底层队列使用管道和锁定实现。 另外,还需要运行支持线程以便队列中的数据传输到底层管道中。 Queue的实例q具有以下方法: q.get( [ block [ ,timeout ] ] ) 返回q中的一个项目。如果q为空,此方法将阻塞,直到队列中有项目可用为止。block用于控制阻塞行为,默认为True. 如果设置为False, 将引发Queue.Empty异常(定义在Queue模块中)。timeout是可选超时时间,用在阻塞模式中。如果在制定的时间间隔内没有项目变为可用,将引发Queue.Empty异常。 q.get_nowait( ) 同q.get(False)方法。 q.put(item [, block [,timeout ] ] ) 将item放入队列。如果队列已满,此方法将阻塞至有空间可用为止。block控制阻塞行为,默认为True。如果设置为False, 将引发Queue.Empty异常(定义在Queue库模块中)。timeout指定在阻塞模式中等待可用空间的时间长短。超时后将引发Queue.Full异常。 q.qsize() 返回队列中目前项目的正确数量。此函数的结果并不可靠,因为在返回结果和在稍后程序中使用结果之间,队列中可能添加或删除了项目。 在某些系统上,此方法可能引发NotImplementedError异常。 q.empty() 如果调用此方法时 q为空,返回True。如果其他进程或线程正在往队列中添加项目,结果是不可靠的。也就是说,在返回和使用结果之间,队列中可能已经加入新的项目。 q.full() 如果q已满,返回为True. 由于线程的存在,结果也可能是不可靠的(参考q.empty()方法)。。
转载自----华为云社区
单看队列,简单代码实现一
1 from multiprocessing import Queue 2 3 4 q = Queue() # 创建一个队列 5 q.put(1) 6 q.put(2) 7 q.put(3) 8 q.put(4) 9 q.put(5) 10 q.put(6) 11 q.put(7) 12 # 获取数据 13 print(q.get()) 14 print(q.get()) 15 print(q.get()) 16 print(q.get()) 17 print(q.get()) 18 print(q.get()) 19 print(q.get())View Code
单看队列,简单代码实现二
1 from multiprocessing import Queue 2 3 4 q = Queue(3) # 创建一个队列 5 q.put(1) 6 q.put(2) 7 q.put(3) 8 # 当超过最大放置量的时候程序执行到这里会堵塞,直到队列里面的内容被取走 9 q.put(3) 10 # 获取数据 11 print(q.get()) 12 print(q.get()) 13 print(q.get())View Code
单看队列,简单代码实现三
1 from multiprocessing import Queue, Process 2 import time 3 4 5 q = Queue() # 创建一个队列 6 7 8 def down_data(): 9 """模拟下载数据,并放入队列中""" 10 for i in range(0, 10): 11 q.put(i) 12 time.sleep(0.1) 13 print("已经放入数据:" + str(i)) 14 15 16 def show_data(): 17 for i in range(0, 10): 18 print(q.get()) 19 20 21 def main(): 22 p1 = Process(target = down_data) 23 p2 = Process(target = show_data) 24 p1.start() 25 p2.start() 26 27 28 if __name__ == "__main__": 29 main()View Code