python-异步处理HTTP请求
我需要为django查询集的每个条目生成一个PDF报告。将有30k到40k个条目 PDF是通过外部API生成的。由于当前是按需生成的,因此这是通过HTTP请求/响应同步处理的。 对于这个任务,这将是不同的,因为我想我将使用django管理命令来循环查询集并执行PDF生成 对于此任务,我应该采用哪种方法?我考虑了两种可能的解决方案,尽管这些技术我从未使用过: 1) :将任务(具有不同负载的http请求)分配给工作者,然后在完成后检索它 2) :以非阻塞方式使用请求 目标是同时使用API(例如,同时发送10或100个http请求,具体取决于API可以处理多少并发请求) 这里有谁处理过类似的任务,并能就如何继续这项工作提出建议 以下是第一次尝试,使用(注意:大多数代码都是重用的,不是我自己编写的,因为我拥有这个项目的所有权。): 不幸的是,运行python-异步处理HTTP请求,python,django,httprequest,python-requests,python-multiprocessing,Python,Django,Httprequest,Python Requests,Python Multiprocessing,我需要为django查询集的每个条目生成一个PDF报告。将有30k到40k个条目 PDF是通过外部API生成的。由于当前是按需生成的,因此这是通过HTTP请求/响应同步处理的。 对于这个任务,这将是不同的,因为我想我将使用django管理命令来循环查询集并执行PDF生成 对于此任务,我应该采用哪种方法?我考虑了两种可能的解决方案,尽管这些技术我从未使用过: 1) :将任务(具有不同负载的http请求)分配给工作者,然后在完成后检索它 2) :以非阻塞方式使用请求 目标是同时使用API(例如,同时
checker.run\u all\u multi
会产生以下效果
- 蟒蛇壳冻结李>
- 不打印输出李>
- 没有生成文件李>
- 我必须从命令行终止控制台,正常的键盘中断停止工作
检查器时。运行\u all
正常(逐个)执行作业
有没有具体的建议来解释为什么这段代码不起作用(而不是我可以用什么来代替多重处理)
谢谢大家。请使用您的频率,一年一次&手动。你不需要芹菜,也不需要期货 创建一个类似于
def record_to_pdf(record):
# create pdf from record
然后使用代码创建管理命令(使用)
不过,管理命令将不是异步的。要使其异步,可以在后台运行它
此外,如果您的进程不受CPU限制(例如,它只调用一些API),那么正如@Anentropic所建议的,您可以在创建池时尝试使用更多的进程。您需要多久生成一次这些报告?生成是手动触发还是自动触发?-每年一次-以这种频率手动触发我倾向于使用请求期货和避免设置rabbitmq的需要etc@Anentropic您能更具体一点或提供任何样品/PoC吗?Thanksclery可能更容易在python端编码,但您必须安装和配置其他软件(MQ,例如rabbit,再加上运行芹菜工作进程)。requests futures将是一个更简单的系统(只是一个python脚本),但您可能必须在python代码中执行某种速率限制,以避免向PDF服务发送40k个请求。对于一个不受cpu限制的任务,您还可以尝试使用number of Prcocess>number of_CORES@Anentropic你是对的,如果方法
record\u to\u pdf
只调用一些API,那么进程的数量可以显著增加(受网络速度和API速率限制的限制)。已尝试。它不向stdout输出任何内容,也不将任何文件保存到目标目录,还冻结shell(我需要使用kill-9杀死它)。相同的代码不需要多次处理,而是按顺序处理每个项目。我可以粘贴代码。有什么想法吗?@Luke请通过编辑您的问题来发布代码。
def record_to_pdf(record):
# create pdf from record
from multiprocessing import Pool
pool = Pool(processes=NUMBER_OF_CORES)
pool.map(record_to_pdf, YOUR_QUERYSET)