Исключение Python в потоке: не может начать новый поток - PullRequest
0 голосов
/ 16 мая 2018

Я пытаюсь запустить код, где я работаю с очередью и потоками. Ниже приведен фрагмент кода:

import threading
from Queue import Queue


def function():
    results = []
    for i in range(68):
        return_list = function2(i)
        results.append(return_list)
        if return_list:
            print("True returned")
        else:
            print("Returned false")
    return results


def function2(i):
    print("In function 2 with: " + str(i))
    results = []
    working_queue = Queue()
    for _ in range(25):
        worker = threading.Thread(target=function3, args=(working_queue, results))
        worker.setDaemon(True)
        worker.start()

    for p in range(150):
        working_queue.put(p)

    working_queue.join()
    return results


def function3(working_queue, results):
    while True:
        try:
            current_item = working_queue.get()
            print("Processing:" + str(current_item))
            results.append("True")
        except Exception as e:
            print("An exception in function 3: " + str(e))
        finally:
            working_queue.task_done()

if __name__ == "__main__":
    results = function()
    print(str(results))

Код вызывает следующее исключение:

Traceback (most recent call last):
File "C:/pythonErrors/stackoverflow.py", line 45, in <module>
    function()
File "C:/pythonErrors/stackoverflow.py", line 8, in function
    return_list = function2(i)
File "C:/pythonErrors/stackoverflow.py", line 24, in function2
    worker.start()
File "C:\Python27\lib\threading.py", line 736, in start
    _start_new_thread(self.__bootstrap, ())
thread.error: can't start new thread

Как мы можем удалить ранее созданные и завершенные темы. Так что при каждом выполнении цикла for в function2() новые потоки не создаются.
Требуется создать только 25 потоков для всего процесса (в настоящее время создается 68x25 потоков)

1 Ответ

0 голосов
/ 17 мая 2018

С тех пор требовалось работать в общей сложности с 25 потоками;создание потоков должно быть частью самой внешней функции (т.е. здесь функция ()).Ниже приведено решение:

import threading
from Queue import Queue


def function():
    results = []
    working_queue = Queue()
    for _ in range(25):
        worker = threading.Thread(target=function3, args=(working_queue, results))
        worker.setDaemon(True)
        worker.start()
    for i in range(68):
        return_list = function2(i, working_queue)
        working_queue.join()
        results.append(return_list)
        if return_list:
            print("True returned")
        else:
            print("Returned false")
    return results


def function2(i, working_queue):
    print("In function 2 with: " + str(i))
    for p in range(150):
        working_queue.put(p)


def function3(working_queue, results):
    while True:
        try:
            current_item = working_queue.get()
            print("Processing:" + str(current_item))
            results.append("True")
        except Exception as e:
            print("An exception in function 3: " + str(e))
        finally:
            working_queue.task_done()


if __name__ == "__main__":
    results = function()
    print(str(results))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...