@
gangdong ……找了一圈才发现有个网络剪贴板名字就叫“网络剪贴板” …… 其实是指 pastebin[.]com 和 paste.ubuntu[.]com 这些
还是先
https://stackoverflow.com/help/minimal-reproducible-example 吧
Pool 里不要传 bound method,会导致整个实例被 pickle,然而 QObject 不能被 pickle
把 LoadFiles.work 搞成 staticmethod 或者 classmethod 或者干脆提出去当作单独函数处理。
https://gist.github.com/no1xsyzy/ef171f987a2e78e5f831e523a14c7e9e#file-v2_714573_2-py-L30-L34你得明白一点,multiprocessing 的基础是 pickle,一切内容都是 pickle 之后通过管道传递到新进程里面去再解开使用,所以参与计算的任何内容都必须可以被 pickle 。但你继承了 C++ 的对象 QObject,就导致了它不能被 pickle (准确地说,它封装了一个 Qt 的 QObject,所以 classmethod 尽管封了一个 QObject 进去但是可以 pickle,因为类本身只有 binding 没有实际的 C++ 层对象)
另外,还有一点就是非 fork() 的方式均会导致整个文件以其他的 __name__ 重新执行一遍,这就是为什么根据平台会要求 __name__ == '__main__',rev2 里我把 __name__ 在子进程打印出来了,你可以看下。