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()
标签:__,Process,name,Python,put,Queue,案例,进程
From: https://www.cnblogs.com/cnpolaris/p/17571030.html