Многопоточность не работает в exe, созданном pyinstaller
Проблема:
После изменения на exe Thread не запускается. Когда я запускаю в pycharm, все работает правильно.
Информация о приложении и пример кода:
Мое приложение смешивает django с пользовательским приложением.
Запуск Django по команде: .\myapp.exe runserver localhost:40218 --noreload
.
import os
import threading
import django
from django.core.management.commands.runserver import Command as runserver
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'rest_api.settings.base')
django.setup()
runserver.default_port = "40218"
from app.processes import start_processing # noqa: E402
from app.threads_configuration import multiple_threads_creator_wrapper # noqa: E402
from manage import main # noqa: E402
if __name__ == '__main__':
try:
ctx = ctx_manager()
threading.Thread(target=multiple_threads_creator_wrapper, args=(start_processing,)).start()
main()
except Exception as e:
print(f'Application closed due to error: {str(e)}')
multiple_threads_creator_wrapper:
def multiple_threads_creator_wrapper(target, *args, **kwargs):
LimitedThread(target=target, *args, **kwargs).start()
RepeatedTimer(target, *args, **kwargs)
Конфигурация потока:
class Config:
def __init__(self) -> None:
self.maxThreads = 10
self.runEveryXSeconds = 5
_config = Config()
_threadLimiter = threading.BoundedSemaphore(_config.maxThreads)
class LimitedThread(threading.Thread):
def run(self):
_threadLimiter.acquire()
try:
self._target(*self._args, **self._kwargs)
finally:
_threadLimiter.release()
class RepeatedTimer(object):
def __init__(self, function, *args, **kwargs):
self._timer = None
self.interval = _config.runEveryXSeconds
self.function = function
self.is_running = False
self.next_call = time.time()
self._args = args
self._kwargs = kwargs
self.start()