我想在类中实例中使用全局变量队列,我创建的队列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에서 실행해보니 위 코드가 맞습니다.
으아아아창문의 잘못인가요?
Windows는 포크를 지원하지 않고, Windows는 포크를 시뮬레이션했던 것으로 기억합니다. 더 이상한 점은 window가 새 프로세스를 생성할 때 이를 생성한 파일을 가져옵니다(자세한 내용은 https://segmentfault.com/q/10...의 다른 답변 참조). 그리고 파일 시작 부분에 대기열을 만듭니다. Productor와 Consumer를 모두 가져올 때 각각 mybuffer?라는 변수를 생성했습니다.
이것이 이유일 것입니다.
Windows에서는 Customer와 Product에 ID(mybuffer)를 각각 출력했는데 서로 다릅니다.
무엇이 옳고 그른지는 모르겠지만 도움이 되었으면 좋겠습니다.