Потоковая передача не работает должным образом, когда функция находится в другом модуле

#python #multithreading #python-multithreading

Вопрос:

В настоящее время я использую поток демона в Python, чтобы постоянно обнаруживать части экрана в фоновом режиме, пока выполняются другие более важные функции. testImToStr находится в том же файле, что и остальная часть кода, который я использую.

     def testImToStr():
        while True:
           pospro.imagetoString();

    doImageToString = threading.Thread(target=testImToStr, args=(), daemon=True)
    doImageToString.start()
    while True:
        #other stuff i was too lazy to copy over
 

Эта версия работает так же, как и обработка изображений, и все остальное в цикле while.
Однако тогда целевой поток находится в другом модуле:

     doImageToString = threading.Thread(target=pospro.loopedImToStr, args=(), daemon=True)
    doImageToString.start()
    while True:
        #other stuff i was too lazy to copy over
 

Другой модуль:

     def loopedImToStr():
        while True:
            imagetoString()

    def imagetoString():
        #stuff here
 

Он только зацикливает целевой поток и не запускает цикл while в файле, который изначально создал поток. Как получается, что оба цикла выполняются, когда поток находится в том же файле, что и цикл, но только поток запускается, когда они находятся в разных файлах?

Комментарии:

1. самая распространенная ошибка — target должно быть имя функции без () (так называемой callback )- target=pospro.loopedImToStr — и позже Thread будет использоваться () для ее запуска.

Ответ №1:

Я думаю, что вся ваша проблема заключается в самой распространенной ошибке — target должно быть имя функции без () — так называемой callback

 Thread(target=pospro.loopedImToStr, daemon=True)
 

и позже Thread.start() будет использовать () для его запуска.

В своем коде вы testImToStr() сразу запускаете, как

 result = testImToStr()

doImageToString = threading.Thread(target=result, ...)
 

таким testImToStr() образом, блокируется весь код, и он не может запустить другой цикл.