如何为“For Loop”运行 gevent 池?
Posted
技术标签:
【中文标题】如何为“For Loop”运行 gevent 池?【英文标题】:How to run gevent pool for "For Loop"? 【发布时间】:2021-09-08 13:27:10 【问题描述】:for row in data:
data2 = collections.OrderedDict()
data2["ID"] = row[0]
data2["Bank Reconciliation Status"] = row[1]
data2["Date"] = row[2]
data2["Branch"] = row[3]
data2["Student"] = row[4]
data2["Amount"] = row[5]
data2["Type"] = row[6]
data2["Remark"] = row[7]
data2["Attachment"] = "<img src=\"data:image/jpeg;base64," + ThumbnailEngine(row[8]) + "\">"
brecon.append(data2)
return json.jsonify("data": brecon)
我可以知道如何为上面的 For 循环设置 gevent 池吗?我需要为从 3rd Party API 下载的缩略图运行尽可能多的并发请求。谢谢。
【问题讨论】:
这样不行。如果你想运行并发requests
,那么运行并发 requests
和 gevent
,而不是 for
-loop。当你运行requests
然后直接创建OrderedDict()
并放在列表中。只有专门为async
创建的函数才能使用gevent
——比如网络连接、从文件读取、从数据库获取——但for
-loop 不是为此创建的。
【参考方案1】:
我终于自己使用了以下解决方案。现在,缩略图在 Jquery Datatable 中的加载速度提高了 15 倍:
from gevent.pool import Pool
import collections
def test(data): # data from postgresql query result as args
data2 = collections.OrderedDict()
data2["ID"] = data[0]
data2["Bank Reconciliation Status"] = data[1]
data2["Date"] = data[2]
data2["Branch"] = data[3]
data2["Student"] = data[4]
data2["Amount"] = data[5]
data2["Type"] = data[6]
data2["Remark"] = data[7]
data2["Attachment"] = "<img src=\"data:image/jpeg;base64," + ThumbnailEngine(data[8]) + "\">"
return data2
p = Pool()
brecon = tuple(p.map(test, data)) # data from postgresql query result
return json.jsonify("data": brecon)
【讨论】:
以上是关于如何为“For Loop”运行 gevent 池?的主要内容,如果未能解决你的问题,请参考以下文章
使用 gevent 执行池的 celery 任务的 SynchronousOnlyOperation
我应该在 celery 中使用 prefork、eventlet 或 gevent 哪个池类?
Python入门学习-DAY37-进程池与线程池协程gevent模块
getName()--ident--enumerate--activeCount--线程池--协程(gevent)--优先级队列