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