Python 在 2 个进程之间共享 Manager.dict() 中的线程对象



我想在 2 个进程之间共享线程对象的字典。我还有另一个对象词典,目前似乎有效。

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

Exception with manager.dict()
    TypeError: can't pickle _thread.lock objects

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

Exception with manager.list()
    TypeError: can't pickle _thread.lock objects

readFiles()功能工作正常。

我使用python 3.5.1(Anaconda)

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')

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

最新更新