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

Gevent thread not popping sequential parameters off list

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

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]

我正在尝试使用具有以下功能的多个 greenlets:

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 个线程(如本例中所示)将导致第一个线程 lo 值为 'a',第二个 'b'。但是我看到 lo 的两个值都设置为 'a' 。为什么会这样?我该如何解决这个问题?

编辑:

qlist = []
d = {'a': a, 'token':token 'q':qlist}
.......

是不是因为你在函数开头实例化了qlist?所以我认为 'a' 是由 pr.query.order_by().all() 重新添加的。也许使 qlist 成为一个全局变量并为 list_object 创建一个列表参数。然后 'a' 应该永久弹出。我可能是错的,因为我假设 pr.query.order_by.all() 每次都将 'a' 添加到列表中。