楼主: yaaas
跳转到指定楼层
上一主题 下一主题
收起左侧

还是不太懂工作的时候什么时候需要用线程呢?

 
🔗
parkhunter 2024-3-10 11:14:56 | 只看该作者
全局:
楼上大家都没提到硬件情况,就是CPU的使用情况,尤其是多U多核的情况。
分享见过的两个场景,一个是Windows下用图形处理的专业软件,有次一台图形工作站装的至强处理器,但是处理速度并不快,打开resource manager看到只有两个核还是四个核在跑,处理器有八个还是十六个核,就是软件没有做到对那款至强处理器的多核支持。
之前写的两个web application,都跑在Linux虚拟机里,都是生成Excel用,一个后端用Python/Flask/openpyxl,一个用Java/Spring Boot/Apache POI。跑起来看CPU使用情况,生成Excel的时候,Python那个就只能用一个核,这个核的使用率可以拉满,Java那个会把所有所有核都上,跑在80%左右。
觉得这主题还挺好的,确实没什么了解,也想多学习学习。抛砖引玉,多线程和多CPU多核的情况,了解的大神多分享下。
回复

使用道具 举报

🔗
draftbk 2024-3-10 11:47:49 | 只看该作者
全局:
分享一种情况就是例如大语言模型用 gpu 这种很贵的东西的时候,我们希望它一刻不停地为我们打工。
在 gpu 里面的运算和在外面的 process 如果都耗时,可以用多个线程来处理,gpu 不用等待前后的一些在 cpu 上的计算,它就可以一直工作,是不是很棒 :)
回复

使用道具 举报

🔗
netcraft 2024-3-10 12:12:27 | 只看该作者
全局:
同时发生的,结果不相干的大量类似任务。
回复

使用道具 举报

全局:
楼主如果你在大厂你用的可能都是包装好framework,其实都是用到线程的。比如你举的例子call api,每个service node本身就是在多线程运作的,包括多线程处理不同的api request。

而且在你的framework已经能完善利用你的server的os level thread(一般跟cpu核数线性关系)的时候,加更多的application level thread并不会提升performance,反而可能会因为更频繁的context switch而起反作用。

所以现在scale out一般都是node层面而不是细分到thread级别。

回复

使用道具 举报

❌ 2
全局:
yaaas 发表于 2024-03-08 22:50:25
但是工作中我们也需要调用多个api,一般来说不用线程似乎也挺快的?到底多少qps,多少反应时间的情况下需要线程呢?
其实你的这个想法大体上没有错,一般在做web service的时候因为cpu的资源是有限的但是同时的并发本身就很高,所以cpu bound的任务是不适合开多线程的。

但是IO bound的任务是很有意义的,比如你的服务依赖了三个别的服务和两个数据库请求而且他们之间没有依赖这个时候并发执行就很关键了,能降低大量的延迟,而且这个模式非常普遍,要注意的是要达到非阻塞的目标有多种实现方式,这个不同操作系统和库大都有自己的具体解决方案
回复

使用道具 举报

🔗
 楼主| yaaas 2024-3-10 17:09:17 来自APP | 只看该作者
全局:
PhoenixS 发表于 2024-03-09 20:27:45
楼主如果你在大厂你用的可能都是包装好framework,其实都是用到线程的。比如你举的例子call api,每个service node本身就是在多线程运作的,
你说的node是aws那种node吗?
回复

使用道具 举报

🔗
 楼主| yaaas 2024-3-10 19:49:55 来自APP | 只看该作者
全局:
lovejane 发表于 2024-03-09 01:12:41
想象一下现在有一个第三方web api是下载一份文件,平均要1秒才有结果,我们有一百个文件id,需求是要从这一百份文件的数据里找某个东西出来,也就是需要调100
那为啥不直接用message queue 呢
回复

使用道具 举报

全局:
yaaas 发表于 2024-03-10 01:09:17
你说的node是aws那种node吗?
不是,就是很general的server node。 可以理解成组成你的cluster的每个server machine(或者container instance)
回复

使用道具 举报

🔗
lovejane 2024-3-11 15:55:54 | 只看该作者
全局:
yaaas 发表于 2024-3-10 04:49
那为啥不直接用message queue 呢

MQ本身是多线程的模式,只是线程的处理都已经被封装好了。之前的例子里需要我们自己去写创建多少个子线程去处理workload,再让多少线程(或者就在主线程里)去接收结果。在单机上本质是一样的,用MQ的话就直接调包写workload的逻辑,底下的线程分配在MQ包里已经处理好了。 但如果数据量变大(比如说需求从100个文件变成100万)的时候,MQ就更容易用来调度多个异地的资源去提升处理能力,而自己手写的多线程可能就需要大改动来配置分布式的处理。
回复

使用道具 举报

😅 1
全局:
法国赌神皮尔卡丹 发表于 2024-03-09 20:41:39
其实你的这个想法大体上没有错,一般在做web service的时候因为cpu的资源是有限的但是同时的并发本身就很高,所以cpu bound的任务是不适合开多线程
CPUbound的任务才需要用多线程 来parallel computing。

IO bound的任务,多线程的话还是在等IO,线程是共享IO的应该。但线程不共享算力。所以nodejs 适合IO bound的application。

Web Service你的framework已经支持高并发了。我们写application code基本上都可以每个request可以看作isolation,比如你的object只是local to这个request的。当然如果需要access critical resource,可能需要考虑DB transaction这些。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表