我有以下代码,(人为的例子):
# !/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
。
我在这里俯瞰什么? 非常感谢任何帮助。
答案 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)