python 进程

本文探讨了Python中多进程通信时使用队列的常见错误,包括进程间数据共享问题、类的不当使用以及管道(Pipe)的误用。通过示例代码,展示了错误的实现方式,并提供了正确的解决方案,强调了减少死循环和正确传递参数的重要性。
摘要由CSDN通过智能技术生成
#思考下下面的写法为什么是错误的!
from multiprocessing import Process,Lock,Pipe,Queue
import os
import queue

#实例化队列,消息队列:产生后被消费就不存储该数据,确保了数据船底得唯一性
qe=queue.Queue()
def pro(n):
    while n <100:
        #put方法是往对列表里面传惨
        qe.put(n)
        print("已发送数据",n)
        n=n+1

def ger():
    while True:
        #get方法是往对队列里面拿取参数
        print("已拿取数据",qe.get())

if __name__ == '__main__':
    #c错误用法,进程不共享导致p_1拿不到p_1的数据
    p_0=Process(target=pro,args=(1,))
    p_1=Process(target=ger,args=())
    p_0.start()
    p_1.start()

#错误的写法2
class pro_ger(object):
    def __init__(self):
        self.qe = queue.Queue()

    def pro(self,n):
        while n < 100:
            # put方法是往对列表里面传惨
            self.qe.put(n)
            print("已发送数据", n)
            n = n + 1

    def ger(self):
        while True:
            # get方法是往对队列里面拿取参数
            print("已拿取数据", self.qe.get())

    def process(self):
        p_0=Process(target=pro,args=(1,))
        p_1=Process(target=ger,args=())
        p_0.start()
        p_1.start()
if __name__ == '__main__':

    pro_ger().process()


#继承Process
class pro_ge(Process):
    def __init__(self):
        Process.__init__(self)


    def  run(self):
        print(1)
        
if __name__ == '__main__':
    p_7=pro_ge()
    p_7.start()#集成了Process后可直接使用进程.start()进程启动
  
 
 #错误写法
class pro_ger(object):
    def __init__(self):
        self.put, self.get = Pipe()

    def pro(self,n):
       for i in range(0,n):
            # put方法是往对列表里面传惨
            self.put.send(n)
            print("已发送数据", n)
            n = n + 1

    def ger(self):
        while True:
            # get方法是往对队列里面拿取参数
            print("已拿取数据", self.get.recv())

    # def process(self):
    #     p_0=Process(target=pro,args=(1,))
    #     p_1=Process(target=ger,args=())
    #     p_0.start()
    #     p_1.start()
if __name__ == '__main__':
    # pro_ger()

    p_0 = Process(target=pro_ger().pro, args=(5,))
    p_1 = Process(target=pro_ger().ger, args=())
    p_0.start()
    p_1.start()
  

#正确写法
#正确写法,任何时候少用死循环
class pro_ger(object):
    # def __init__(self):


    def pro(self,n,put):
       for i in range(0,n):
            # put方法是往对列表里面传惨
            put.send(i)
            print("已发送数据", i)


    def ger(self,get):
        while True:
            # get方法是往对队列里面拿取参数
            print("已拿取数据", get.recv())

    # def process(self):
    #     p_0=Process(target=pro,args=(1,))
    #     p_1=Process(target=ger,args=())
    #     p_0.start()
    #     p_1.start()
if __name__ == '__main__':
    # pro_ger()
    put, get = Pipe()
    p_0 = Process(target=pro_ger().pro, args=(1000,put))
    p_1 = Process(target=pro_ger().ger, args=(get,))
    p_0.start()
    p_1.start()

#正确写法,任何时候少用死循环
class pro_ger(object):
    # def __init__(self):


    def pro(self,n,qe1):
       for i in range(0,n):
            # put方法是往对列表里面传惨
            qe1.put(i)
            print("已发送数据", i)


    def ger(self,qe1):
        while True:
            # get方法是往对队列里面拿取参数
            print("已拿取数据", qe1.get())

    # def process(self):
    #     p_0=Process(target=pro,args=(1,))
    #     p_1=Process(target=ger,args=())
    #     p_0.start()
    #     p_1.start()
if __name__ == '__main__':
    # pro_ger()
    #这是进程带的队列,不是queue,queue不支持多进程
    qe1=Queue()
    p_0 = Process(target=pro_ger().pro, args=(1000,qe1))
    p_1 = Process(target=pro_ger().ger, args=(qe1,))
    p_0.start()
    p_1.start()



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值