Gevent线程不会从列表中弹出顺序参数

时间:2015-08-03 17:29:13

标签: python multithreading gevent

我在烧瓶应用程序中有以下内容:

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}
.......

1 个答案:

答案 0 :(得分:1)

是因为你在函数的开头实例化了qlist吗?所以我认为' a'正在由pr.query.order_by()。all()重新添加。也许让qlist成为一个全局变量,并为list_object创建一个list参数。那么' a'应永久弹出。我错了,因为我假设pr.query.order_by.all()正在添加' a'每次到列表。