I usually don't deploy under uWSGI, so I can't confirm.
But what you are describing would make sense if uWSGI "workers" are subprocesses.
In that case, by the description of "lazy-apps" option I would guess that if that option is False, uWSGI will fork() with the app already loaded (and by consequence the multiprocessing.Queue already existing). As multiprocessing.Queue is in fact implemented over a pipe the file descriptor will be cloned in sub processes. This is probably causing some odd condition in multiprocessing.Queue which breaks it.
Solution is to run things with lazy-apps or try to find a way to recreate the queue within the new processes.
I saw uwsgi has a "close-on-exec" option to close all inherited file descriptors in forked subprocesses, maybe that will help? If you are lucky enough the multiprocessing.Queue might recreate a new pipe if the current one is closed (or might just crash :D didn't check in multiprocessing source code)
It's all guessing here, but it's a reasonable guess.