用 windows 写 Python 真的大丈夫?

2017-10-18 11:15:06 +08:00
 takanasi

经常遇到诡异的问题,换 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 里面的东西,直接当空气了。

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

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

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

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

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

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

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

而且你所你所 @ 的几位的给你的回复,是“装逼”?要不要一条一条的重新读一遍,然后指点一下我们,这几条回复的逼点在哪里?

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

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

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

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

© 2021 V2EX