Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python在两个进程之间共享manager.dict()中的线程对象_Python_Multithreading_Dictionary - Fatal编程技术网

python在两个进程之间共享manager.dict()中的线程对象

python在两个进程之间共享manager.dict()中的线程对象,python,multithreading,dictionary,Python,Multithreading,Dictionary,我想在两个进程之间共享线程对象的dict。我还有另外一份物品的目录,目前似乎还有效 问题是,当我尝试向dict添加键/值对时,它会引发异常(key是整数,value是线程对象): 我尝试从manager.dict()切换到manager.list(),它也不起作用: Exception with manager.list() TypeError: can't pickle _thread.lock objects readFiles()函数工作正常 我使用python 3.5.1(An

我想在两个进程之间共享线程对象的dict。我还有另外一份物品的目录,目前似乎还有效

问题是,当我尝试向dict添加键/值对时,它会引发异常(
key
是整数,
value
是线程对象):

我尝试从
manager.dict()
切换到
manager.list()
,它也不起作用:

Exception with manager.list()
    TypeError: can't pickle _thread.lock objects
readFiles()
函数工作正常

我使用python 3.5.1(Anaconda)


我可以说,你不能在进程之间共享线程,如果你想在不同的进程中启动线程,你可以共享这些线程的参数,或者你可以共享一些结果。您看到的问题是由进程创建的性质引起的,在python中,所有参数都将在当前进程中序列化,然后传递给新进程,然后python将在那里反序列化它们以运行“目标”。显然,线程对象是不可序列化的(您可以检查这个有趣的线程以了解序列化问题)。

您遇到了什么异常?将异常跟踪添加到问题。当我使用dict()时,它会引发异常。。。TypeError:使用list时无法序列化'\io.TextIOWrapper'对象它引发异常。。。TypeError:can't pickle\u thread.lock objects Hanks,对于这个答案,我尝试思考如何以不同的方式处理它。。。当我想将线程对象存储在一个列表中(而不是在manager.list()中)时,是否仍需要对其进行pickle处理?问题是线程对象不可序列化,您可以实现自己的序列化器/反序列化器tho,但不能在另一个进程中使用同一线程。是的,您可以在任何结构中存储线程对象,这没有问题。感谢这些提示,我只需更改代码,将routingtable作为json格式传递给进程,并在进程中创建需要的线程对象
Exception with manager.list()
    TypeError: can't pickle _thread.lock objects
def startAlgorithm(fNameGraph, fNameEnergyDistribution, fNameRouteTables):
    global _manager, _allTiesets, _allNodes, _stopDistribution

    _manager = Manager()
    _allTiesets = _manager.dict()
    _allNodes = _manager.dict()

    _stopDistribution = Value(c_bool, False)

    readFiles(fNameGraph, fNameEnergyDistribution, fNameRouteTables)
    initializeAlgorithm()

    procTADiC = Process(target=TADiC, args=(_stopDistribution, _allNodes))
    procTA = Process(target=TIESET_AGENT, args=(_stopDistribution, _allNodes, _allTiesets))
    procTADiC.start()
    procTA.start()

    procTADiC.join()
    procTA.join()


def initializeAlgorithm():
    global _graphNX, _routingTable, _energyDistribution, _energyMeanValue

    #Init all Nodes
    allNodeIDs = _graphNX.nodes()
    energySum = 0
    for node in allNodeIDs:
        nodeEnergyLoad = float(_energyDistribution.get(str(node)))
        nodeObj = Node(node, nodeEnergyLoad)
        _allNodes[node] = nodeObj
        energySum = energySum + nodeEnergyLoad

    #Calculate the mean value from the whole energy in the graph
    _energyMeanValue = energySum / len(allNodeIDs)

    #Init all Tieset-Threads
    for tieset in _routingTable:
        tiesetID = int(tieset['TiesetID'])
        connNodes = list(tieset['Nodes'])
        connEdges = list(tieset['Edges'])
        adjTiesets = list(tieset['AdjTiesets'])
        tiesetThread = Tieset(tiesetID, connNodes, connEdges, adjTiesets)
        _allTiesets[tiesetID] = tiesetThread        # Raise Exception!!!!!!!!!!


class Node:
    'Node-Class that hold information about a node in a tieset'

    def __init__(self, nodeID, energyLoad):
        self.nodeID = nodeID
        self.energyLoad = energyLoad
        self.tiesetFlag = False


class Tieset(threading.Thread):
    'Tieset-Class as Thread to distribute the load within the tieset'

    def __init__(self, tiesetID, connectedNodes, connectedEdges, adjTiesets):
        threading.Thread.__init__(self)
        self.tiesetID = tiesetID
        self.connectedNodes = connectedNodes
        self.connectedEdges = connectedEdges
        self.adjTiesets = adjTiesets
        self.leaderNodeID = min(int(n) for n in connectedNodes)
        self.measureCnt = 0


    def run(self):
        print('start Thread')