即使从Python中的另一个线程填充,队列也始终为空

时间:2018-01-19 13:50:11

标签: python multithreading python-2.7 multiprocessing

我有以下代码,(人为的例子):

# !/usr/bin/python

from multiprocessing import Queue
import threading
import Queue as Q
import time
from random import randint

class SomeClass:

    def takes_awhile(self, mq):
        qjson = {}
        time.sleep(5)
        qjson.update(
            {"randint": randint(1, 9)}
        )
        mq.put(qjson)

    def record(self, jq):
        while True:
            self.takes_awhile(jq)
            time.sleep(0.05)


sc = SomeClass
jq = Queue()
scp = threading.Thread(target=sc.record, args=(jq,))
scp.start()


def qprint():
    try:
        rv = jq.get_nowait()
    except Q.Empty:
        return "Empty"
    return rv


while True:
    print qprint()

想要这样做是为qprint()始终在被叫时立即返回,如果Empty过了takes_awhile的时间太短,则打印put {1}}任何事情进入队列,但是大约5秒左右后,我应该开始看到takes_awhile的返回值(带有随机数的json),被拉出队列。相反,无论循环运行多长时间,它始终打印Empty

我在这里俯瞰什么? 非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

您的代码目前无效 - 我收到了像

这样的例外情况
  

TypeError:必须使用SomeClass调用未绑定的方法record()   instance作为第一个参数(改为获取Queue实例)

sc.record调用中将参数传递给Thread时,您没有引用SomeClass的实例,而是引用类本身 - 因此self参数未正确传递。要解决此更改sc = SomeClass()以实例化该类,然后threading.Thread调用会传递一个对象。

我添加了一个while循环,因此无限期运行并打印结果。在这些变化之后,它对我来说似乎非常有效。

输出如下:

Empty 
Empty 
Empty 
Empty 
{'randint': 4} 
Empty 
Empty

这是我跑的代码:

from multiprocessing import Queue
import threading
import time
import Queue as Q
from random import randint

class SomeClass:

    def takes_awhile(self, mq):
        qjson = {}
        time.sleep(5)
        qjson.update(
            {"randint": randint(1, 9)}
        )
        mq.put(qjson)

    def record(self, jq):
        while True:
            self.takes_awhile(jq)
            time.sleep(0.05)    

sc = SomeClass()
jq = Queue()
scp = threading.Thread(target=sc.record, args=(jq,))
scp.start()    

def qprint():
    try:
        rv = jq.get_nowait()
    except Q.Empty:
        return "Empty"
    return rv

while True:
    time.sleep(1)    
    print qprint()

答案 1 :(得分:1)

您有一些小错误。您需要使用sc = SomeClass()实例化SomeClass。你错过了括号。在你的while循环中放一个小睡眠也是一个好主意。如此快速打印,您就无法看到非空的'声明。这是您修改过的代码......

#!/usr/bin/python
from multiprocessing import Queue
import threading
import Queue as Q
import time
from random import randint

class SomeClass(object):
    def takes_awhile(self, mq):
        qjson = {}
        time.sleep(1)
        qjson.update(
            {"randint": randint(1, 9)}
        )
        mq.put(qjson)

    def record(self, jq):
        while True:
            self.takes_awhile(jq)
            time.sleep(0.05)

sc = SomeClass()
jq = Queue()
scp = threading.Thread(target=sc.record, args=(jq,))
scp.start()

def qprint():
    try:
        rv = jq.get_nowait()
    except Q.Empty:
        return "Empty"
    return rv

while True:
    print qprint()
    time.sleep(0.25)