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

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

répondre à tous(1)
黄舟

Le code ci-dessus est correct lorsque je l'exécute sous macOS.

Producer append an element
Consumer pop an element
Producer append an element
Consumer pop an element

Est-ce la faute de Windows ?
Je me souviens que Windows ne prend pas en charge fork et que Windows simule fork. Ce qui est encore plus étrange, c'est que lorsque window crée un nouveau processus, elle importe le fichier qui l'a créé (voir une autre réponse https://segmentfault.com/q/10... pour plus de détails). Et vous créez une file d'attente au début du fichier. Lorsque Producteur et Consommateur ont importé, ils ont chacun créé une variable appelée mybuffer ?
Cela devrait être la raison.
Dans Windows, j'ai imprimé l'ID (mybuffer) respectivement dans Client et Produit, et ils sont différents.

Je ne sais pas ce qui est bien ou mal, j’espère que ça aide.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!