python3.6中的多线程通信

python3.6中的多线程通信,python,python-3.6,python-multithreading,Python,Python 3.6,Python Multithreading,我试图在Python3.6中开发一个多线程函数,有时我的代码会冻结。根据我的测试,我认为问题来自os.write()或os.read(),但我不知道为什么 这是我的代码(我认为partialTransform()不会导致冻结,但我把它放在这里是为了理解代码): 例如,当k=4时,尺寸为33928,当k=5时,尺寸为43040,所以我认为这不是问题所在? 使用的核心数量似乎对冻结没有任何影响 我仍然是python的初学者,所以这可能是显而易见的,但我在互联网上没有发现任何类似的问题。您知道是什么原

我试图在Python3.6中开发一个多线程函数,有时我的代码会冻结。根据我的测试,我认为问题来自os.write()或os.read(),但我不知道为什么

这是我的代码(我认为partialTransform()不会导致冻结,但我把它放在这里是为了理解代码):

例如,当k=4时,尺寸为33928,当k=5时,尺寸为43040,所以我认为这不是问题所在? 使用的核心数量似乎对冻结没有任何影响


我仍然是python的初学者,所以这可能是显而易见的,但我在互联网上没有发现任何类似的问题。您知道是什么原因导致这些冻结吗?

管道具有有限大小的缓冲区,在父级读取管道之前,子级将阻止写入管道。但是家长正在等待孩子退出,所以你挂断了。您可以通过将对象写入临时文件来避免缓冲区限制。当父级读取时,数据将在操作系统文件缓存中,因此它仍然很快

这里面有一个诡计。父级需要说服libc在子级写入文件后重新检查该文件,否则读取将仅由其0长度的内部缓存满足。您可以通过
搜索
来实现这一点

import tempfile

def naiveTransform(netData,**kwargs):

        // *** code removed for example ***
        # files
        tmp = [tempfile.TemporaryFile() for _ in range(nbrCore)]
        pid = [-1]*nbrCore

        for i in range(nbrCore):
            try:
                pid[i] = os.fork()
            except OSError:
                exit("Could not create a child process\n")


            if pid[i] == 0:
                if i < nbrCore-1 :
                    g = partialTransform(i*nbrPointCore, (i+1)*nbrPointCore)
                else :
                    g = partialTransform(i*nbrPointCore, nbrPoint)  #to be sure that there is not a forgoten point.
                print("write in " + str(i))
                import sys
                print(sys.getsizeof(g))
                pickle.dump(g, tmp[i])
                tmp[i].close()
                print("exit")
                exit()

        for i in range(nbrCore):
            print("waiting " + str(i))
            finished = os.waitpid(pid[i], 0)
            print("received")
            # seek to get updated file content
            tmp[i].seek(0,2)
            tmp[i].seek(0)
            graph += pickle.load(tmp[i])

        return graph
导入临时文件
def转换(网络数据,**kwargs):
//***例如,代码已删除***
#档案
tmp=[tempfile.TemporaryFile()用于范围内的(nbrCore)]
pid=[-1]*nbrCore
对于范围内的i(nbrCore):
尝试:
pid[i]=os.fork()
除操作错误外:
退出(“无法创建子进程\n”)
如果pid[i]==0:
如果i
管道具有操作系统缓冲区。当写入大于该大小时,写入程序阻塞,而读取器消耗。如果写程序块,<代码> WaistPix<代码>不会返回并且冻结。您可能希望父进程读取管道,直到它关闭,然后解开。请考虑将此更改为一个演示问题的小的工作示例。然后我们可以运行它,编辑它,然后发布解决方案。谢谢,有没有其他方法可以将大对象发送给父对象,或者我必须进行循环以进行写入/读取?另一种方法是使用临时文件而不是管道。操作系统缓存了它,所以它仍然非常快。
print(sys.getsizeof(g))
import tempfile

def naiveTransform(netData,**kwargs):

        // *** code removed for example ***
        # files
        tmp = [tempfile.TemporaryFile() for _ in range(nbrCore)]
        pid = [-1]*nbrCore

        for i in range(nbrCore):
            try:
                pid[i] = os.fork()
            except OSError:
                exit("Could not create a child process\n")


            if pid[i] == 0:
                if i < nbrCore-1 :
                    g = partialTransform(i*nbrPointCore, (i+1)*nbrPointCore)
                else :
                    g = partialTransform(i*nbrPointCore, nbrPoint)  #to be sure that there is not a forgoten point.
                print("write in " + str(i))
                import sys
                print(sys.getsizeof(g))
                pickle.dump(g, tmp[i])
                tmp[i].close()
                print("exit")
                exit()

        for i in range(nbrCore):
            print("waiting " + str(i))
            finished = os.waitpid(pid[i], 0)
            print("received")
            # seek to get updated file content
            tmp[i].seek(0,2)
            tmp[i].seek(0)
            graph += pickle.load(tmp[i])

        return graph