Python 并发问题如何解决?
实验室做的一个小的人脸匹配, 服务端用神经网络判断是属于哪个人, 然后把结果返回客户端, 当我们几个人用几部手机同时测试时,就出问题了, 图片同时上传到服务端, 不知道结果该返回给哪部手机。 想在服务端可以给收到的图片排个队,然后一个一个识别,把结果发到相应的客户端,不知各位有什么思路啊,求教!!
Python 并发问题如何解决?
只有实验室才会出现的问题系列。。。
肯定要在传图片的时候加上识别 id 啊。。
Python里搞并发,主要就三条路:多进程、多线程和异步IO。选哪条得看你的任务是什么类型。
1. 多进程 (multiprocessing)
适合CPU密集型任务(比如大量计算),能绕过GIL。用Process或者Pool都行。
from multiprocessing import Pool
def cpu_bound_task(x):
return x * x
if __name__ == '__main__':
with Pool(processes=4) as pool:
results = pool.map(cpu_bound_task, range(10))
print(results) # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
2. 多线程 (threading)
适合I/O密集型任务(比如网络请求、文件读写),虽然GIL会让CPU任务变慢,但I/O等待时线程会让出GIL。
import threading
import time
def io_bound_task(name, delay):
time.sleep(delay)
print(f"Task {name} done")
threads = []
for i in range(3):
t = threading.Thread(target=io_bound_task, args=(i, 1))
t.start()
threads.append(t)
for t in threads:
t.join()
print("All threads finished")
3. 异步IO (asyncio)
这是现在处理高并发I/O的推荐方式,用单线程就能同时跑很多任务,效率高。
import asyncio
async def fetch_data(task_id, delay):
await asyncio.sleep(delay)
print(f"Task {task_id} fetched data")
return f"data_from_{task_id}"
async def main():
tasks = [fetch_data(i, 1) for i in range(3)]
results = await asyncio.gather(*tasks)
print("All async tasks done:", results)
asyncio.run(main())
简单总结:CPU用多进程,I/O用多线程或异步。
好歹说清楚前端是什么架构吧
目前我做了一个 linux 下的 qt 界面,拍照,上传,接受显示结果
之前一个学弟写了个 app,我们几个人同时测试,就各种错误。。。。
只有实验室才会出现的问题系列。。。
哈哈……
只有实验室才会出现的问题+1, 图片上传保存在 server 的时候用 ip+后缀保存,然后按 ip 推送结果?
客户端上传后服务器端生成个随机字符串作为 key,保存进长连接里,存入队列的时候也带着这个 key,处理图像进程处理完后可以根据 key 找到那个长连接
你缺少了唯一标识符,少年
首先如果是用 http 上传的话,你上传完了会话就断开了吗?
这里如果不断开让客户端等待,然后后端处理完了再返回给这个会话的客户端就行了吧
不用一个个排队, 每步手机都是用户登录, 用户是唯一的,可做唯一标识, 解析完图片在根据这个唯一标识传回就可以了
只有实验室才会出现的问题系列+
没有 session 机制的么?
非 python 问题
做用户机制……
不要听他们的,最简单的就是多台机器,一人一台服务器
假如十个人呢?一百个人呢?一千个呢?
这跟 python 并发有关系???
要有幽默感……
连续高级黑。。。
http 是无状态的!!!
不常来 V2EX 吧
吃鲸,并发问题……
我 out 了
只有实验室才会出现的问题系列,O(∩_∩)O~
同步的话就木有这个问题,当然你的识别结果要快;异步的话,自然要引入回调来通知 client 端取结果。不过这个场景下,要异步的话也没什么人会用了吧,太慢了等不了
这种问题跟 python 有个鸡毛的关系?
accept 连接-接受图片数据-调用识别函数-返回结果,这不是一个连接吗,怎么会返回到别的客户端去?
财大气粗的实验室解决方案
想说的,楼上都说了
只有实验室才会出现的问题系列
这不是并发问题吧…
app 和服务端保持长连接,然后记录图片和连接对应关系,done
额。。。。。不常来 v2ex,感谢大家的批评和建议

