我在烧瓶应用程序中有以下内容:
d = {'a': a, 'token':token}
import gevent.monkey
gevent.monkey.patch_socket()
threads = [gevent.spawn(myfunction, d) for i in range(2)]
result = gevent.joinall(threads)
print [thread.value for thread in threads]
我试图使用以下函数的多个greenlet:
def myfunction(args):
a= args['a']
token= args['token']
lo = list_object()
lo设置为:
def list_object():
qlist = []
# the following redis db lookup produces qlist=[a,b,c,......z]
qlist = pr.query.order_by('failed').all()
return qlist.pop(0)
我注意到虽然我期望每个gevent threadlet弹出列表中的第一个元素,但运行2个线程(如本例中)会导致第一个线程值为'a',第二个' b”。但是我看到lo的两个值都设置为'a'。为什么会这样?我该如何解决这个问题?
编辑:
qlist = []
d = {'a': a, 'token':token 'q':qlist}
.......
答案 0 :(得分:1)
是因为你在函数的开头实例化了qlist吗?所以我认为' a'正在由pr.query.order_by()。all()重新添加。也许让qlist成为一个全局变量,并为list_object创建一个list参数。那么' a'应永久弹出。我错了,因为我假设pr.query.order_by.all()正在添加' a'每次到列表。