V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
James369
V2EX  ›  Python

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

  •  
  •   James369 · 2021-07-04 13:17:39 +08:00 · 4499 次点击
    这是一个创建于 998 天前的主题,其中的信息可能已经有所发展或是发生改变。
    js 脚本都有 WebWorkers 线程,让人心动。
    WebWorkers 允许开发者把长时间运行和密集计算型的任务放在后台执行而不会阻塞 UI,这会使得应用程序运行得更加流畅。甚至可以用于复杂的 3D 运算任务。
    同时,WebWorker 传参方式也兼顾了安全性,比如可以序列化后再传递,或者直接转移参数对象的所有权。

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

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

    @XiaoxiaoPu 目前也没有语言能实现动态大小的复杂对象基于共享内存吧,使用 RPC 调用方式基本上是最简单的实现方式了
    Sasasu
        21
    Sasasu  
       2021-07-04 23:48:20 +08:00
    @wwqgtxx

    > 目前也没有语言能实现动态大小的复杂对象基于共享内存吧

    解决这个的方法叫线程
    yolee599
        22
    yolee599  
       2021-07-05 08:53:09 +08:00 via Android
    你需要的不是 python,而是一个支持线程的编程语言
    wwqgtxx
        23
    wwqgtxx  
       2021-07-05 08:57:07 +08:00 via iPhone
    @Sasasu 这里的前提当然是特指多进程的情况下
    no1xsyzy
        24
    no1xsyzy  
       2021-07-05 09:25:55 +08:00
    @wwqgtxx 说的意思大约是其他语言可以靠线程实现,只有 Python 有 GIL 的问题,不能用线程做 CPU 密集,进程又不方便。
    真要做也不是不可以,用相对指针。

    @James369 Python 的特点就是快速原型。写大了用最像 Python 的高度工程化的语言 Golang 不行吗? f
    matrix67
        25
    matrix67  
       2021-07-05 09:42:59 +08:00
    @James369 openstack 就是 Python 写的,大型项目,但它主要是搞调度,不是 cpu 密集型。
    James369
        26
    James369  
    OP
       2021-07-05 10:30:29 +08:00
    @yolee599 #22
    Python 本身很好用,灵活快速,第三方库又多,又简单易上手。但是就是有这个小缺陷。
    相反,别的语言都在不断的进化。比如 C++,加了很多现代特性,什么右值转移、auto 类型推导、lambda 编程、async 异步编程等等。
    我觉得 C++还可以再活 100 年。
    hunk
        27
    hunk  
       2021-07-05 21:40:27 +08:00 via iPhone
    为了多线程,果断换用 go,协程眨眼间完事
    Rwing
        28
    Rwing  
       2021-07-05 21:54:14 +08:00
    c#欢迎你,另外 python 不是也有 async/await 吗?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3334 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 13:25 · PVG 21:25 · LAX 06:25 · JFK 09:25
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.