Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python-异步处理HTTP请求_Python_Django_Httprequest_Python Requests_Python Multiprocessing - Fatal编程技术网

python-异步处理HTTP请求

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(例如,同时

我需要为django查询集的每个条目生成一个PDF报告。将有30k到40k个条目

PDF是通过外部API生成的。由于当前是按需生成的,因此这是通过HTTP请求/响应同步处理的。 对于这个任务,这将是不同的,因为我想我将使用django管理命令来循环查询集并执行PDF生成

对于此任务,我应该采用哪种方法?我考虑了两种可能的解决方案,尽管这些技术我从未使用过:

1) :将任务(具有不同负载的http请求)分配给工作者,然后在完成后检索它

2) :以非阻塞方式使用请求

目标是同时使用API(例如,同时发送10或100个http请求,具体取决于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)