gpt4 book ai didi

python - 进程之间的数据共享问题

转载 作者:行者123 更新时间:2023-12-01 06:11:20 25 4
gpt4 key购买 nike

我对 Python 相当陌生,我正在编写一个多处理示例脚本。代码长约 100 行,因此您可以在这里找到它 - http://pastie.org/1813365

这是一个发生在正方形字段上的简单游戏 - 它们被表示为矩阵(每个列表包含 x 个元素的 x 个嵌套列表)。为每个玩家创建一个单独的游戏场。

我创建的每个进程都代表一个玩家。每回合和每个“玩家”,都会生成(随机)两个坐标和一个数字(0-9)。每个“玩家”都试图将自己的数字放在他在场上的坐标上;如果这些坐标中其他玩家的字段上没有数字,或者该数字小于第一个玩家的数字,或者如果第一个玩家有“0”(就像“ clown 卡”) - 该数字是(嗯,应该是)放置在两个字段上,并且玩家的分数会增加。游戏在指定的迭代次数后结束。

所有数据都存储在包含数据的类的单个对象中,该对象从主线程传输到“第一个玩家”线程,然后不断地从一个线程传输到另一个线程,来回,直到游戏结束。 “JoinableQueue”正用于此目的。

代码的问题在于,似乎每个“玩家”都有自己的两个游戏字段副本。如果您每轮输出两个玩家的两个游戏字段,您可以清楚地看到这一点 - 它们对于每个玩家来说都是相同的。例如,注释行没有效果,因为另一个玩家的(轮到他打印的)字段永远不会被修改:

if x.data_PC[y2][x2] == 'X' or z2 == 0 or int(x.data_PC[y2][x2]) < z2:         
x.data_PC2[y2][x2] = str(z2) # doesn't work
x.data_PC[y2][x2] = str(z2)
x.score_PC2 += 1

这特别奇怪,因为对象中的所有剩余数据似乎都工作得很好。

是什么原因导致这种行为以及如何解决这个问题?

最佳答案

好的,您的问题与多处理无关。如果您查看您的 data 类定义(您应该将类​​名大写,这是 pythonic 这样),您创建的所有变量都是类变量。您希望它们位于 __init__ 方法中并定义为 self.foo=1 ,以便它们是实例变量并且可以在进程之间传递。就像这样:

class Data(object):

def __init__(self):

self.SIZE = 8 # dimensions of the game field
self.MAX_TURNS = 5 # amount of iterations for each of the players ("turns") before the end
self.turns = 0 # count of turns done
self.score_PC = self.score_PC2 = 0 # score values

# create and init the data matrices
self.data_PC = [['X' for j in xrange(self.SIZE)] for i in xrange(self.SIZE)]
self.data_PC2 = [['X' for j in xrange(self.SIZE)] for i in xrange(self.SIZE)]

现在简单介绍一下多处理方面。如果您使用可连接队列,则实际上并不需要锁。您需要做的就是 .get() 数据,处理它,然后 .put() 将其放回到队列中,并让它知道 .task_done ()。它将处理并发性。

在这里,我发布了your code with the needed edits .

关于python - 进程之间的数据共享问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5723508/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com