python中为什么类的实例方法不可以直接访问队列全局变量?
巴扎黑
巴扎黑 2017-04-18 10:15:02
0
1
844

我想在类中实例中使用全局变量队列,我创建的队列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!'
巴扎黑
巴扎黑

全員に返信(1)
黄舟

上記のコードは、macOS で実行すると正しいです。

リーリー

Windowsのせいでしょうか?
Windows はフォークをサポートしておらず、Windows はフォークをシミュレートしていることを思い出しました。さらに奇妙なのは、ウィンドウが新しいプロセスを作成するときに、それを作成したファイルをインポートすることです(詳細については、別の回答https://segmentfault.com/q/10...を参照してください)。そして、ファイルの先頭にキューを作成します。 Productor と Consumer の両方がインポートされると、それぞれ mybuffer? という変数が作成されました。
それが理由のはずです。
Windows では、Customer と Product に ID (mybuffer) をそれぞれ出力しましたが、それらは異なります。

何が正しいか間違っているか分かりませんが、お役に立てれば幸いです。

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!