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



我有以下代码(人为示例(:

# !/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()在调用时始终立即返回,如果经过的时间太短,takes_awhile无法将任何内容put队列中,则打印Empty,但是大约 5 秒左右后,我应该开始看到 takes_awhile 的返回值(带有随机数的 json(, 被拉出队列。相反,无论循环运行多长时间,它总是打印Empty

我在这里忽略了什么?任何帮助都非常感谢。

你有一些小错误。 您需要使用 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)

您的代码当前无效 - 我收到类似

TypeError: unbound Method record(( 必须使用 SomeClass 调用 实例作为第一个参数(取而代之的是队列实例(

Thread调用中将参数传递给sc.record时,引用的不是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()

相关内容

  • 没有找到相关文章