我想在类中实例中使用全局变量队列,我创建的队列mybuffer作为全局变量,然后Producer和Consume两个类的实例中使用这个全局变量,实际在windows的cmd中的的执行情况是class Producer中的的queue.put()一直在执行,但是class Consumer中的get()确一直没有得到队列中的元素,感觉这个mybuffer到两个类中变成了局部变量。
如果我把mybuffer队列做为成员变量分别传到两个类的实例中是可以正常的put()和get()
不知道全局变量的队列在类里面却不能用了。。。。。。
#!/usr/bin/env python # -*- coding: utf-8 -*- from multiprocessing import Process, Semaphore, Lock, Queue import time mybuffer = Queue(10) class Consumer(Process): def __init__(self,lock): Process.__init__(self) self.lock = lock def run(self): global mybuffer while True: mybuffer.get() self.lock.acquire() print('Consumer pop an element') self.lock.release() time.sleep(1) class Producer(Process): def __init__(self,lock): Process.__init__(self) self.lock = lock def run(self): global mybuffer while True: mybuffer.put('1') self.lock.acquire() print('Producer append an element') self.lock.release() time.sleep(1) if __name__ == '__main__': #mybuffer = Queue(10) lock = Lock() p = Producer(lock) c = Consumer(lock) c.start() p.start() p.join() c.join() print 'Ended!'
上面的代码我在macOS下执行是正确的。
Producer append an element Consumer pop an element Producer append an element Consumer pop an element
是不是windows的锅?
我记得windows并不支持fork,windows是模拟的fork。更加诡异的是window在创建新进程的时候,会把创建它的文件import进去(详情见另一个回答 https://segmentfault.com/q/10...)。而你在文件开头创建了一个队列。Productor和Consumer都import进去的时候各自都创建了一个叫mybuffer的变量?
应该是这个原因。
在windows下我各自打印了Customer和Productor中的id(mybuffer),两者是不一样的。
不知对错,希望对你有帮助。