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
takanasi
V2EX  ›  Python

用 windows 写 Python 真的大丈夫?

  •  
  •   takanasi · 2017-10-18 11:15:06 +08:00 · 9974 次点击
    这是一个创建于 2595 天前的主题,其中的信息可能已经有所发展或是发生改变。

    经常遇到诡异的问题,换 ubuntu 就没事了。 比如说:

    import multiprocessing, time, queue
    
    # g_queue = queue.Queue()
    g_queue = multiprocessing.Queue()
    c = multiprocessing.cpu_count()
    
    def init_queue():
        print("init g_queue start")
    
        while not g_queue.empty():
            g_queue.get()
    
        for _index in range(10):
            g_queue.put(_index)
    
        print("init g_queue end")
        
    def task_io(task_id):
        print("IOTask[%s] start" % task_id)
    
        while not g_queue.empty():
            try:
                data = g_queue.get(block=True, timeout=1)
                print("IOTask[%s] get data: %s" % (task_id, data))
                time.sleep(1)
            except Exception as excep:
                print("IOTask[%s] error: %s" % (task_id, str(excep)))
    
        print("IOTask[%s] end" % task_id)
        
        
    if __name__ == '__main__':
        print("cpu count:", multiprocessing.cpu_count(), "\n")
        print("========== 多进程执行 IO 密集型任务 ==========")
        init_queue()
        time_0 = time.time()
        process_list = [multiprocessing.Process(target=task_io, args=(i,)) for i in range(c)]
    
        for p in process_list:
            p.start()
    
        for p in process_list:
            if p.is_alive():
                p.join()
    
        print("结束:", time.time() - time_0, "\n")
    

    完全拿不到 queue 里面的东西,直接当空气了。

    53 条回复    2017-10-30 18:19:03 +08:00
    wwqgtxx
        1
    wwqgtxx  
       2017-10-18 11:31:51 +08:00 via iPhone
    你这样写当然拿不到参数,windows 下不支持 fork,所以你的 queue 不能声明为全局变量,只能作为参数传进你的函数,要不然就变成两个独立的对象了
    whx20202
        2
    whx20202  
       2017-10-18 11:32:18 +08:00
    可以配置 IDE 插件,同步到 linux 环境里面,然后调试,别在 IDE 里面调试涉及到底层的
    araraloren
        3
    araraloren  
       2017-10-18 11:52:49 +08:00
    @wwqgtxx linux 也不可以,凑巧罢了

    @takanasi 你应该去看官方的文档,里面有告诉你如何在多"线程"之间共享数据

    https://docs.python.org/2/library/multiprocessing.html
    geelaw
        4
    geelaw  
       2017-10-18 12:06:04 +08:00
    并不需要看代码就可以总结出一个命题:

    要么是 Python 的实现是有问题的,要么是 po 主写的代码本来就是不可移植的。
    NoAnyLove
        5
    NoAnyLove  
       2017-10-18 12:07:13 +08:00
    用 Windows 写 Python 的路过。这个问题就算你不会看文档,谷歌一下也是会出来答案的
    enenaaa
        6
    enenaaa  
       2017-10-18 12:07:57 +08:00
    这只能说明你没好好看文档。
    Tuisku
        7
    Tuisku  
       2017-10-18 12:12:44 +08:00   ❤️ 24
    Windows 拒绝了你的锅,并冲你吐了口水,呸。
    XIVN1987
        8
    XIVN1987  
       2017-10-18 12:16:19 +08:00 via Android
    Windows 写 py 的路过
    SuperMild
        9
    SuperMild  
       2017-10-18 12:35:17 +08:00
    有问题就解决问题,没有系统是完美的,代码不能跨平台也是常见的事
    wellsc
        10
    wellsc  
       2017-10-18 12:38:39 +08:00 via iPhone
    在 win 下用 python 处理 excel 还是妥妥的
    takanasi
        11
    takanasi  
    OP
       2017-10-18 12:40:31 +08:00
    @wwqgtxx
    @araraloren
    @geelaw
    @NoAnyLove
    @enenaaa
    @Tuisku
    不好意思,打断你们装逼一下,这不是我写的,我就是拿来说明 Windows 和 linux 的不同而已

    https://zhuanlan.zhihu.com/p/24283040
    tosexxx
        12
    tosexxx  
       2017-10-18 12:40:43 +08:00
    何必那么纠结环境
    wwqgtxx
        13
    wwqgtxx  
       2017-10-18 12:42:11 +08:00
    @araraloren 在 Linux 上如果 multiprocessing 的 context 使用的是 fork 方式,这样写应该是可以的,但如果使用的是 spawn 方式这样写是肯定会出错的
    wwqgtxx
        14
    wwqgtxx  
       2017-10-18 12:44:18 +08:00
    @takanasi 然后呢,你把这个问题发上来是要说明什么,还是你自己才是打算过来装逼一下?
    那个程序自己写的有问题,就不该那样写,出了问题怪谁
    Shura
        15
    Shura  
       2017-10-18 12:45:47 +08:00
    @takanasi 你有没有考虑为什么会有这种不同呢?
    topbandit
        16
    topbandit  
       2017-10-18 12:46:20 +08:00
    所以来给知乎打广告了
    araraloren
        17
    araraloren  
       2017-10-18 12:50:13 +08:00
    @wwqgtxx maybe,不了解这个问题
    其实我感觉这是 python 自己的问题,这代码从逻辑上看是没有问题的吧。。
    wwqgtxx
        18
    wwqgtxx  
       2017-10-18 12:54:00 +08:00
    @araraloren 这个从原理上说就是一个普通 C 程序的全局变量共享问题,如果是 fork 模式的话,那么在 fork 之前对全局变量的修改会被 fork 的子进程继承,如果是 spawn 模式的话,第一个程序对全局变量的任何修改在子进程都不可见
    SuperMild
        19
    SuperMild  
       2017-10-18 12:58:36 +08:00
    你用 C#写一个在逻辑上没有问题在 Win 上完美编译运行的程序,直接拿到 Linux 上去也有可能出问题,能说是 C#语言本身的问题?

    就算是 Java 也能写出不跨平台的代码,那么 Java 也有问题?

    就算不能直接跨平台是个问题,那也是一切语言的问题,不能单独拿 python 说事。
    Tuisku
        20
    Tuisku  
       2017-10-18 12:59:25 +08:00
    @takanasi #11
    不好意思,所以你就用别人的代码拿上来装了一个逼顺便送给 Windows 一个锅,然后被人指正之后又把锅甩给原作者了是吗?

    而且你所你所 @ 的几位的给你的回复,是“装逼”?要不要一条一条的重新读一遍,然后指点一下我们,这几条回复的逼点在哪里?
    laqow
        21
    laqow  
       2017-10-18 13:04:08 +08:00 via Android
    操作系统对 c 语言的限制在 python 上都有,不是 python 的锅
    takanasi
        22
    takanasi  
    OP
       2017-10-18 13:07:21 +08:00
    @wwqgtxx
    @Tuisku
    我就是想问问 windows 和 linux 有什么常见的不同,正好有这么个例子而已。算了,反正已经歪了
    NoAnyLove
        23
    NoAnyLove  
       2017-10-18 13:10:04 +08:00
    @takanasi 不知道你想表达什么。如果你看网上一些讨论多进程的代码,很多是不能直接在 Windows 上运行的,比如 Windows 下需要额外的处理__main__和 freeze_support()。不过解决问题本身就是程序员的技能,如果刚好对系统知识有一定了解,有知道如何去代码中找答案,那么是不会产生这种疑问的,因为这并不是诡异的问题,而是系统限制,且有文档说明了这个问题。

    https://stackoverflow.com/questions/8276933/python-multiprocessing-lock-issue
    Patrick95
        24
    Patrick95  
       2017-10-18 13:12:10 +08:00
    @takanasi #22 你这个帖子也不像是在问啊,妥妥的吐槽帖。
    这是不对的。正帖里明明在吐槽,回帖中有人纠正就说别人在「装逼」。

    人家有说错什么吗?就算人家不是解答给你的,也可以解答给那些对这个问题抱有疑惑的人啊。你「装逼」这个词注定了你不想好好讨论,还怪别人歪楼。
    NoAnyLove
        25
    NoAnyLove  
       2017-10-18 13:12:20 +08:00
    @takanasi 你这并不是问问题的态度,且主楼中看不到提问。我没看出来我的回答“装逼”在了哪里。
    Lucius
        26
    Lucius  
       2017-10-18 13:21:15 +08:00
    @Tuisku #20

    装逼的点在于你们的回复,打了 LZ 装逼的脸。
    mentalkiller
        27
    mentalkiller  
       2017-10-18 13:24:25 +08:00
    感谢 LZ 丰富 block 列表
    MushishiXian
        28
    MushishiXian  
       2017-10-18 13:37:02 +08:00
    你的标题压根不是在问问什么系统有什么常见的不同,如果是你的表达能力有问题的话,那也是你的问题,你怎么就觉得人家在装逼呢?
    luozisha
        29
    luozisha  
       2017-10-18 13:43:30 +08:00
    平心而论,我觉得这个帖的 title 才是最装逼的。难道用 Linux 写 Python 就是大丈夫了吗?
    860670496
        30
    860670496  
       2017-10-18 13:49:37 +08:00
    造轮子也是要看路的啊
    公路胎上雪地那不是大概率表演原地漂移
    ytmsdy
        31
    ytmsdy  
       2017-10-18 14:28:51 +08:00
    用 windows 写了 3 年 python 的淡定路过。。
    pycharm 下面写的溜溜的。
    araraloren
        32
    araraloren  
       2017-10-18 14:59:45 +08:00
    @wwqgtxx 恩,想到了
    不过只能限制在只读的情况下了,我想得有点复杂了
    szetrov
        33
    szetrov  
       2017-10-18 15:22:56 +08:00 via Android
    大兄弟心气好高 2332 楼下的几位回复连“怼”都称不上,就是正常回复,结果被说成是装逼。呵呵了 2333
    stanjia
        34
    stanjia  
       2017-10-18 15:25:15 +08:00
    @Tuisku 哈哈哈哈哈
    geelaw
        35
    geelaw  
       2017-10-18 15:27:38 +08:00
    @takanasi #11 不懂,那我再问一下:为什么你会觉得 Windows 上的行为是“不正常的”?

    @SuperMild #19 取决于文档,要求是表现和文档一致,而且这并不是一个语言的问题,而是一个语言的实现的问题。

    @takanasi #22 这样提问的方式是不好的,首先你的例子不够简单,其次如果你认为这段代码应该在不同平台表现一致,那么这说明这段代码使用的 Python 的部分应该把这种不同抽象掉,而不是现在的情况,最后似乎也没人能解读出来你的帖子的意思,所以或许你说的和我们说的不是同一种语言。
    sonyxperia
        36
    sonyxperia  
       2017-10-18 15:59:15 +08:00
    Java 在等着楼主
    zgx030030
        37
    zgx030030  
       2017-10-18 16:01:42 +08:00
    如果某段代码是在 win 上正常反而你放在 linux 下出错,你会起个“用 linux 写 python 真的大丈夫”的标题吗?如果不会且默默的把 Linux 下的错误改正,说明你可能有一种在 linux 下做开发的优越感。
    matsuijurina
        38
    matsuijurina  
       2017-10-18 16:12:57 +08:00 via Android
    你不用开源库无所谓。python 好多机器学习的开源库作者根本没试过在 windows 下编译,一运行就出错。
    takanasi
        39
    takanasi  
    OP
       2017-10-18 16:13:10 +08:00
    @zgx030030 我一个天天用装 windows 神船写程序的低逼格人士莫名其妙又变成有一种在 linux 下做开发的优越感了。
    太冤了。
    annielong
        40
    annielong  
       2017-10-18 17:09:23 +08:00
    感觉 写代码真到这个地步的时候,大多都已经转 linux 了,而平常没用到这种地步的人,继续用 windows 也没啥问题,
    PythonAnswer
        41
    PythonAnswer  
       2017-10-18 19:22:52 +08:00 via Android
    python 对 windows 支持很好的
    lslqtz
        42
    lslqtz  
       2017-10-18 19:22:58 +08:00
    PHP 还有小部分兼容性问题呢
    你开心就好
    megachweng
        43
    megachweng  
       2017-10-18 20:06:32 +08:00 via iPhone
    PyQt 也是,在 Mac linux 下都没问题,拿到 windows 就 c000005😌
    focusheart
        44
    focusheart  
       2017-10-18 22:52:48 +08:00
    @Lucius 有道理!
    wolong
        45
    wolong  
       2017-10-19 07:15:13 +08:00
    windows 下开发 python,只要不是在 cmd 下运行 py,其实还好。
    guofs
        46
    guofs  
       2017-10-19 07:48:05 +08:00 via Android
    这跟在 v2 或内地用繁体一样,你高兴就好
    x7395759
        47
    x7395759  
       2017-10-19 09:01:03 +08:00
    知乎的技术氛围也配来 V2 讨论?
    tbag781623489
        48
    tbag781623489  
       2017-10-19 09:19:13 +08:00 via iPhone
    我有个疑问: win10 的 bash 能不能达到原生 ubuntu 的效果?
    ooh
        49
    ooh  
       2017-10-19 09:22:45 +08:00 via Android
    给你说个常见的不同吧,大小写敏感 滑稽
    ranwu
        50
    ranwu  
       2017-10-19 11:34:18 +08:00
    遇到问题解决问题就行了。
    Arnie97
        51
    Arnie97  
       2017-10-19 12:19:55 +08:00 via Android
    既不是 Windows 的锅也不是 Python 的锅,代码本身不考虑可移植性的话,换哪个平台都一样
    sixand
        52
    sixand  
       2017-10-19 22:15:23 +08:00
    docker 能帮到你。。我在 windows 下就是用 docker 来执行的。
    allgy
        53
    allgy  
       2017-10-30 18:19:03 +08:00
    微软厉害还是你厉害?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1190 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 23:11 · PVG 07:11 · LAX 15:11 · JFK 18:11
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.