1
yannxia 2023-03-13 21:21:40 +08:00
多开几个呗,前面 nginx 负载下,这个主要卡点是 exe 呀,不管怎么样处理需要 1 秒,没办法解决
|
3
learningman 2023-03-13 21:23:24 +08:00
就是不阻塞主 thread 呗,开个单独的 process 当 daemon 处理,async 通信。
图方便就每个请求进来都开,就是压力交给操作系统的调度了。 |
4
des 2023-03-13 21:37:33 +08:00 via iPhone
开线程池吧,主要还是看你这 exe 占不占系统资源
|
5
zhuangzhuang1988 2023-03-13 21:38:34 +08:00
https://docs.python.org/3/library/asyncio-subprocess.html
proc = await asyncio.create_subprocess_shell( cmd, stdout=asyncio.subprocess.PIPE, stderr=asyncio.subprocess.PIPE) |
6
ClericPy 2023-03-13 21:39:48 +08:00
https://docs.python.org/zh-cn/3/library/asyncio-subprocess.html
asyncio 子进程 对协程不熟悉的话真不建议用协程, 不然会经历很多痛苦的地方: CPU 密集阻塞事件循环, 同步代码阻塞异步任务, 多线程开太多切换成本太大.....等等 |
7
edis0n0 OP @zhuangzhuang1988 #5
@ClericPy #6 发现加工返回数据的 python 逻辑也很慢(好几个 http 请求,都用的 requests ,没有统一包装,改起来很麻烦,但资源消耗不高),有办法把这部分逻辑也放到主线程外吗? |
8
westoy 2023-03-13 21:45:58 +08:00
开一个队列进程去执行那个 exe
直接给原来的 popen 打猴子补丁, 劫持成扔队列 |
10
wangyongbo 2023-03-13 21:56:58 +08:00
如果你不会 python ,那你不如再找一个新的外包帮你改吧。
|
11
zhuangzhuang1988 2023-03-13 22:06:09 +08:00
|
12
lysoul 2023-03-14 23:24:51 +08:00
python 的协程要求所有调用的方法都支持协程,否则该阻塞还是阻塞,还是开多线程吧
|
13
lolizeppelin 2023-03-21 11:27:33 +08:00
你这个需求从一开头就错了...根本就不是 python 的问题
http 本身就是一来一回的,http 请求都必须等待数据返回协议才结束. 无论你用协程还是线程执行 exe.都要等待结果才能返回,http 协议才能结束,连接才能结束. 想要异步 http 1.x 协议下只能这样做 创建一个 http 请求,服务端把请求的具体执行插入队列,然后立刻返回一个唯一识标,然后返回 客户端通过唯一识标反复重试去拿结果. 否则得用 websocket,这样改动更大 这是 http 协议的问题不是 python 的问题 |