将线程添加到数独检查器

时间:2016-10-03 21:26:56

标签: python multithreading python-3.x

我刚刚在Python中创建了一个简单的函数,它检查数独板(输入是否作为列表给出)是否有效。我这样做的方式很简单:

  • 检查数独板是否为9x9

  • 检查每行只出现一次

  • 检查每列只出现一次
  • 检查每个3x3网格每个数字是否恰好出现一次

现在,一旦我开始这个,我想利用并学习一些关于Python线程的知识。我在SO上阅读了文档,还有一些很棒的一般多线程相关帖子,但我想不出在我的检查器中实现它们的方法。

现在,我希望线程的工作方式(我认为)是一个线程,用于检查每列是否包含1-9位数,另一个用于检查相同行的行,另外9个线程用于检查每个3x3子网格。你能告诉我(最终有一些解释)我怎么能做到这一点?感谢

1 个答案:

答案 0 :(得分:2)

所以给出一些关于如何实现这一目标的一般性指示,而不是带走任何挑战。让我们从导入线程开始:

import threading

这将让我们使用线程对象!此外,为了知道Sudoku网格在事后是否有效,我们需要一个变量来存储True / False条件。您可以选择单个变量,并使用Thread Locks确保没有其他线程访问它同时,或与三个分开。为简单起见,我将在此示例中使用三个单独的变量

LinesValid = False
ColumnsValid = False
GridsValid = False

然后,由于线程需要一个函数或另一个callable作为其目标运行,并且您需要一个用于列,行和每个3x3网格的线程,我们需要为每个线程提供三个函数。但是,由于有9列,9行和9个网格,我相信为网格做一个单独的线程会好得多,但为了练习的目的,我认为可以做一个每个

def CheckLines():
    # Line Checking Code

def CheckColumns():
    # ColumnCheckingCode

def CheckGrid(UpperLeft, BottomRight):
    # GridCheckingCode

无论如何,我们在这里定义了三个函数,并使用适当的行检查代码。就像线条会检查X轴,列是Y轴,但想法是将它分开。对于CheckGrid,如果您希望每个磁贴都有一个线程,则需要指定角点,或者如果您决定使用单个线程,则只需将其定义为:

def CheckGrid():
    # GridCheckingCode

之后我们需要制作我们的主题:

LineThread = threading.Thread(target=CheckLines)
ColumnThread = threading.Thread(target=CheckLines)
GridThread = threading.Thread(target=CheckLines, args=([0, 0], [2, 2]))

如果不需要网格,可以忽略GridThread中的参数。否则,您需要指定角点,并找到循环指定切片的方法。

之后,在向用户显示数据之前,启动线程并将它们与主线程连接是一个问题:

LineThread.start()
ColumnThread.start()
GridThread.start()

LineThread.join()
ColumnThread.join()
GridThread.join()

if sum(LinesValid, ColumnsValid, GridsValid) == 3:
    print("The grid is valid!")
else:
    print("The grid is invalid!")

在这里,我们检查所有Bool是否为True:( 1 + 1 + 1 ) == 3如果是,并根据此情况向用户打印数据。这些bool在各自的Check **函数中将设置为True / False!

如果您需要一些更直接的解决方案,而不是一般性的解释方向,请告诉我,我会一起扔东西!最后一段代码看起来像这样:

import threading

def CheckLines(self):
    # Line Checking Code

def CheckColumns(self):
    # ColumnCheckingCode

def CheckGrid(self, UpperLeft, BottomRight):
    # GridCheckingCode

LinesValid = False
ColumnsValid = False
GridsValid = False

LineThread = threading.Thread(target=CheckLines)
ColumnThread = threading.Thread(target=CheckLines)
GridThread = threading.Thread(target=CheckLines, args=([0, 0], [2, 2]))

LineThread.start()
ColumnThread.start()
GridThread.start()

LineThread.join()
ColumnThread.join()
GridThread.join()

if sum(LinesValid, ColumnsValid, GridsValid) == 3:
    print("The grid is valid!")
else:
    print("The grid is invalid!")