【Python】python中为什么类的实例方法不可以直接访问队列全局变量?

我想在类中实例中使用全局变量队列,我创建的队列mybuffer作为全局变量,然后Producer和Consume两个类的实例中使用这个全局变量,实际在windows的cmd中的的执行情况是class Producer中的的queue.put()一直在执行,但是class Consumer中的get()确一直没有得到队列中的元素,感觉这个mybuffer到两个类中变成了局部变量。

【Python】python中为什么类的实例方法不可以直接访问队列全局变量?
如果我把mybuffer队列做为成员变量分别传到两个类的实例中是可以正常的put()和get()

【Python】python中为什么类的实例方法不可以直接访问队列全局变量?

不知道全局变量的队列在类里面却不能用了。。。。。。

#!/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),两者是不一样的。

不知对错,希望对你有帮助。

以上是 【Python】python中为什么类的实例方法不可以直接访问队列全局变量? 的全部内容, 来源链接: utcz.com/a/80653.html

回到顶部