Python多进程使用案例

Python多进程使用案例

为什么推荐多进程?

由于python解释器GIL锁的存在,python中的多线程并不是真的多线程,事实上是在一个cpu内核上运行的,无法调用电脑的多核性能,就出现了一个人干活,剩下几个人在旁边围观的经典场景。那么为了更好的提升性能,在一定情况下是推荐使用多进程模式实现功能的。但是在python多进程中我们需要注意一个事情是,由于每个进程的资源相互独立,那么我们应该尽量避免共享资源。

多进程间通信

由于目前的场景仅使用到Queue队列,所以以下示例都是在队列情况下进行的。

Queue是多进程安全的队列,可以使用Queue实现多进程之间的数据传递,同时相比较Pipe来说,Queue允许多个进程同时往队列中put数据,而Pipe的数据流动是单向的,比较适用于一对生产者消费者的场景下。put方法用于插入数据到队列中,put方法还有两个可选参数:blocked和timeout。如果blocked为True(默认值),并且timeout是正值,该方法会阻塞timeout指定的时间,直到该队列有剩余的空间。如果超时,则会抛出Queue Full 异常。如果blocked为False,那么如果该队列已满,会立刻抛出Queue Full异常。

get方法用于从队列中取出一个元素,同时类似put方法,get也有两个可选参数:blocked和timeout,作用效果和put的类似,就不详细展开了,这两个参数一般情况下都是用不到的。

多进程挂起

在有的多进程中需要临时挂起一个子进程,可以使用以下方法实现。

from multiprocessing import Process
import psutil
import time

def getter("name"):
  while True:
  	print(f"Process {name} is running")
    time.sleep(1)
if __name__ == "__main__":
  p = Process(target=getter, args=("getter", ))
  p.start()
  pid = p.pid 	# 获取进程id
  proc = psutil.Process(pid)	
  proc.suspend()	# 挂起进程
  time.sleep(3)
  prop.resume()	# 恢复进程
代码示例
from multiprocessing import Process, Queue
import psutil
import time
import random

def getter("name", q):
  print(f"Process {name} is running")
  while True:
    raw_data = q.get()
    print('get', raw_data)
def putter("name", q):
  print(f"Process {name} is running")
  while True:
    raw_data = random.random()
    q.put(raw_data)
    time.sleep(1)
    
if __name__ == "__main__":
  q = Queue()
  get_p = Process(target=getter, args=("getter", q, ))
  put_p = Process(target=putter, args=("putter", q, ))
  get_p.start()
  put_p.start()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值