Multithreaded Python implementation of a Sudoku validator
The way you're starting the block threads looks wrong to me.  You're starting each thread with the same parameters (the grid and a queue):

t = Thread(target=check_3x3_grid, args=(grid, q))


I can't see anywhere that the thread is told which block it is supposed to check.  So, instead of starting 9 threads, one to check each block, it looks like you're starting 9 threads and having each of them check all nine of the blocks.

You could partition the blocks and then start a thread to validate each block, but this seems like overkill.  Simply starting a single thread to check the nine blocks is the smallest change and probably the right one to make, since checking nine blocks is almost the same amount of work as checking the nine horizontals/verticals.  With that in mind, you can simply change the code to the following (an achieve the same result with 8 less threads):

#...

grid_thread = Thread(target=check_3x3_grid, args=(grid, q))
grid_thread.start()

#...

grid_thread.join()


Or a slightly more concise:

validation_threads = [Thread(target=check_rows, args=(grid, q))
                     ,Thread(target=check_columns, args=(grid, q))
                     ,Thread(target=check_3x3_grid, args=(grid, q))]

[t.start() for t in validation_threads]
[t.join() for t in validation_threads]