Попытка получить два цикла while для одновременной работы с использованием многопоточности или многопоточности. - PullRequest
0 голосов
/ 07 июня 2019

Согласно онлайн-примерам, эти два метода, которые я попробовал, должны стать решением моей проблемы (см. Код).Эти два цикла while выполняются один за другим, даже если они находятся в разных потоках.

Я пробовал многопоточность и многопоточность.

    global numberit
    numberit= 0
    global numberg
    numberg= 0
    def countingit(numberit):
        while numberit < 10:
            numberit += 1
            print("counter ", numberit)
            # time.sleep(1)

    def garbage(numberg):
        while numberg < 10:
            numberg += 1
            print("garbage ", numberg)
            # time.sleep(1)


    # threading.Thread(target=countingit(numberit)).start()
    # threading.Thread(target=garbage(numberg)).start()

    if  __name__ == '__main__':
        Process(target=countingit(numberit)).start()
        Process(target=garbage(numberg)).start()
    #     threading.Thread(target=countingit(numberit)).start()
    #     threading.Thread(target=garbage(numberg)).start()

Я пытаюсь заставить его напечатать:

counter 1 мусор 1 counter 2 мусор 2

... и т. Д.

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

Спасибо.

Я уже попробовал то, что показано в приведенном мною примере кода.

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

Это результат:

counter 1 ... counter 10 мусор 1 ... мусор 10

Но хотелось бы: счетчик 1 мусора 1 ... счетчик 10 мусора 10

1 Ответ

1 голос
/ 07 июня 2019

Я вижу проблему в этих двух строках:

 threading.Thread(target=countingit(numberit)).start()
 threading.Thread(target=garbage(numberg)).start()

Это обычный антипаттерн - вместо создания потока, который вызывает countingit с аргументом numberit, этот код вызывает countingit сразу в основном потоке, а затем передает возвращаемое значение инициализатору потока. .

Чтобы передать аргументы функции, вызываемой потоком, используйте параметр args. Обязательно передайте его как кортеж, даже если есть только один аргумент.

threading.Thread(target = countingit, args=(numberit,)).start()
threading.Thread(target = garbage, args=(numberit,)).start()

Когда я запускаю это на моей машине, я получаю вывод, который чередуется по желанию:

counter  1
counter  2
garbage  1
counter  3
garbage  2
counter  4
counter  5
garbage  3
counter  6
counter  7
garbage  4
counter  8
garbage  5
counter  9
garbage  6
counter  10
garbage  7
garbage  8
garbage  9
garbage  10

(все эти рекомендации также применимы к вашей попытке на основе процесса)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...