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' 添加到列表中。
我的烧瓶应用程序中有以下内容:
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' 添加到列表中。