Issue 22600: In Multiprocessing Queue() doesn't work with list : __.put(list) != __.get() (original) (raw)

Hello, I have to find the right order of a list, for example try = [0,1,2,3,4,5,6,7,8,9] try = [0,1,2,3,4,5,6,7,9,8] try = [0,1,2,3,4,5,6,8,7,9] and so on... in this example there are factorial(10) = 3,6 million possible order to test. The results with be all the list 'try' that match with the test.

To go faster

The problem is that on exactly the same example

I first believed that when 2 processes call the function rightorder.put(try) at the same time, the lists ares mixed together in the Queue().

But even when I force cpu_count() to 1 (mono process) I still have the problem.

To solve the problem I converted the list try=[2,3,0,4,2,9,7,8,1,5] in a string try2="2304297815" and since now rightorder.put(try) and rightorder.get() always give the same results.

So I suppose that in multiprocessing with a Queue() rightorder.put(try) works if try is a number or a string but doesn't works if try is a list.

"solution.put(c)" takes a reference to the list c. And then the test() function continues running!

By the time the list is serialized and sent back to the main process (in another thread), the test() function has already changed it...

As you noticed, you can use immutable objects instead (string, int), or make a copy of the list: solution.put(c.copy())