js 都有 worker 线程,什么时候 Python 也能增强一下线程?

2021-07-04 13:17:39 +08:00
 James369
js 脚本都有 WebWorkers 线程,让人心动。
WebWorkers 允许开发者把长时间运行和密集计算型的任务放在后台执行而不会阻塞 UI,这会使得应用程序运行得更加流畅。甚至可以用于复杂的 3D 运算任务。
同时,WebWorker 传参方式也兼顾了安全性,比如可以序列化后再传递,或者直接转移参数对象的所有权。

反观 Python,我还在纠结它的 GIL 全局锁,不知道怎么处理 CPU 密集型操作?。
4795 次点击
所在节点    Python
28 条回复
muzuiget
2021-07-04 13:21:01 +08:00
WebWorkers 本身就是进程,你用再起一个 Python 不也是一样。
James369
2021-07-04 13:22:53 +08:00
@muzuiget 进程传数据比较麻烦,同时开销也比较大
muzuiget
2021-07-04 13:27:16 +08:00
WebWorkers 之间通信也是要序列化对象,而不是共享内存,所以它用起来就是个“进程”。
TypeError
2021-07-04 13:37:00 +08:00
Concurrent.futures
processpoolexecutor
learningman
2021-07-04 15:05:11 +08:00
@muzuiget 可以共享内存的,SharedMemoryBuffer 吧好像是这个。把指针传过去就行了。
tkmiles
2021-07-04 15:12:35 +08:00
当你纠结于 GIL 同时不知道怎么规避它或者规避它的开销不可容忍的时候, 这个时候你已经不需要 python 了
lesismal
2021-07-04 15:18:15 +08:00
出门左转,golang 欢迎你
ipwx
2021-07-04 15:38:39 +08:00
learningman
2021-07-04 16:14:07 +08:00
@ipwx 我说 js 你发个 python 的文档给我干啥。。。
tabris17
2021-07-04 16:42:32 +08:00
gil 警告,py 多进程也凑合用吧
matrix67
2021-07-04 17:04:43 +08:00
CPU 密集型操作不要选择用 python
zeroDev
2021-07-04 17:11:16 +08:00
用进程和协程
abersheeran
2021-07-04 18:47:11 +08:00
@learningman 他的意思是 Python 多进程也可以共享内存。

对于这种脚本语言来说,共享内存里的对象和共享内存,差别还是蛮大的。你能直接从共享内存里处理一个巨复杂的对象吗?好像比较难吧。不像 C,整个内存排布都是固定的,想怎么玩就怎么玩。
shendun
2021-07-04 20:03:36 +08:00
@ipwx 大佬求联系方式 想邀请您一起改变世界
Sasasu
2021-07-04 20:12:41 +08:00
你把 python 想象成巨大配置文件,用来描述一个数据流的过程发给 C++,然后 C++ 去跑。这是 "处理 CPU 密集型操作" 的标准流程。
wwqgtxx
2021-07-04 20:34:42 +08:00
@abersheeran 巨复杂的对象直接用 multiprocessing.Manager 不就得了
XiaoxiaoPu
2021-07-04 20:52:23 +08:00
@wwqgtxx 能存放复杂对象的 Manager 是基于进程间通信的;使用共享内存的 Manager 只支持固定大小的简单类型数组
abersheeran
2021-07-04 20:54:22 +08:00
@wwqgtxx 你要是真用过,你就会发现这玩意疯狂上锁,据我的测试,Manager 所在进程跑到 100%,其他进程只有 45% 的样子。一核有难,七核围观。
James369
2021-07-04 21:46:42 +08:00
@matrix67 #11 如果这样,那 python 可能就不大适合于中大型工程。
wwqgtxx
2021-07-04 23:15:37 +08:00
@abersheeran Manager 疯狂上锁倒是真的,以前在做工程的时候还遇到过 Manager 内部线程泄露的问题,最后自己魔改了 Manager 的源码才解决的问题。Manager 所在进程跑到 100%的原因还是因为所有的该对象的抽中是在 Manager 所在进程操作的,其他进程只是调用,自然 CPU 占用低

@XiaoxiaoPu 目前也没有语言能实现动态大小的复杂对象基于共享内存吧,使用 RPC 调用方式基本上是最简单的实现方式了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/787433

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX