#python #multithreading #python-3.x
#python #многопоточность #python-3.x
Вопрос:
Я только что создал простую функцию на Python, которая проверяет, является ли доска судоку (ввод задается в виде списка) допустимой или нет. То, как я это сделал, довольно просто:
-
проверьте, является ли доска для судоку размером 9×9
-
убедитесь, что каждое число отображается только один раз в строке
- убедитесь, что каждое число отображается только один раз в столбце
- убедитесь, что каждое число отображается ровно один раз в сетке 3×3
Теперь, когда я начал это делать, я хотел воспользоваться этим и немного узнать о потоках Python. Я прочитал документы, а также несколько потрясающих сообщений, связанных с многопоточностью, здесь, на SO, но я просто не мог придумать способ их реализации в моей программе проверки.
Теперь, как я хотел бы, чтобы потоки работали (как я и думал), один поток проверяет, что каждый столбец содержит 1-9 цифр, другой проверяет строки на то же самое, и еще девять потоков проверяют каждую подсетку 3×3. Не могли бы вы, ребята, рассказать мне (в конечном итоге с некоторыми объяснениями), как я мог бы этого добиться? Спасибо
Комментарии:
1. Вам нужно фиксированное количество потоков или произвольное число? Решение для X потоков отличается от решения для 9 потоков.
2. @acbabis Ну, я бы хотел, чтобы один поток для проверки столбцов, другой для проверки строк и еще 9 для этих случаев подсети 3×3. Таким образом, будет 11 потоков. Вот как я об этом подумал.
Ответ №1:
Итак, чтобы дать некоторые общие указания о том, как этого добиться, не устраняя никаких проблем. Начнем с импорта потоков:
import threading
Что позволит нам использовать объекты потоков! Кроме того, чтобы узнать, будет ли сетка судоку действительной после факта, нам нужна переменная для хранения условия True / False. Вы можете либо использовать одну переменную и использовать блокировки потоков, чтобы другие потоки не обращались к ней одновременно, либо использовать три отдельных. Для простоты я буду использовать три отдельные переменные в этом примере
LinesValid = False
ColumnsValid = False
GridsValid = False
Затем, поскольку потокам требуется функция или другой вызываемый объект для запуска в качестве цели, и вам нужен поток для столбцов, строк и для каждой сетки 3×3, нам нужны три функции для каждого потока. Однако, поскольку существует 9 столбцов, 9 строк, а также 9 сеток, я считаю, что было бы намного лучше просто выполнить один поток и для сеток, но для целей упражнения, я полагаю, можно сделать по одному для каждого.
def CheckLines():
# Line Checking Code
def CheckColumns():
# ColumnCheckingCode
def CheckGrid(UpperLeft, BottomRight):
# GridCheckingCode
В любом случае, здесь мы определяем наши три функции с соответствующим кодом проверки строк. Например, строки будут проверять ось X, а столбцы — ось Y, но идея состоит в том, чтобы разделить ее. Для контрольной сетки вам нужно будет указать углы, если вы хотите, чтобы у нее был поток для каждой плитки, или, если вы выберете один поток, вы просто определите его как:
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!")
Здесь мы проверяем, все ли наши Bools верны: ( 1 1 1 ) == 3
если они есть, и печатаем данные пользователю на основе этого. Для этих bools будет установлено значение True / False в их соответствующих функциях Check **!
Если вам нужны какие-то более прямые решения, а не общее направление с объяснениями, пожалуйста, дайте мне знать, и я что-нибудь придумаю! Последняя часть кода выглядит примерно так:
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!")
Комментарии:
1. Спасибо. Не могли бы вы проверить мое решение из приведенного ниже? Это решение :)?
2. Привет, возможно, я слеп, но, похоже, я не могу найти решение, на которое вы ссылаетесь?