我有以下代码(人为示例(:
# !/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()