Python 并发问题如何解决?

实验室做的一个小的人脸匹配, 服务端用神经网络判断是属于哪个人, 然后把结果返回客户端, 当我们几个人用几部手机同时测试时,就出问题了, 图片同时上传到服务端, 不知道结果该返回给哪部手机。 想在服务端可以给收到的图片排个队,然后一个一个识别,把结果发到相应的客户端,不知各位有什么思路啊,求教!!


Python 并发问题如何解决?
33 回复

只有实验室才会出现的问题系列。。。

肯定要在传图片的时候加上识别 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,感谢大家的批评和建议

回到顶部