Попытка запустить два цикла while одновременно с использованием потоковой или многопроцессорной обработки

Согласно примерам в Интернете, эти два метода, которые я пробовал, должны быть решением моей проблемы (см. код). Эти два цикла 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()

Пытаюсь распечатать:

счетчик 1 мусор 1 счетчик 2 мусор 2

... и так далее.

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

Спасибо.

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

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

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

счетчик 1 ... счетчик 10 мусор 1 ... мусор 10

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

«Я уже пробовал то, что показано в приведенном мной примере кода». В вашем сообщении должна быть проблема с форматированием — я вижу выход вашего кода, но не вижу самого кода. Пожалуйста, редактировать вашего сообщения и убедитесь, что код вашего примера виден.
Kevin 07.06.2019 16:44

Только что закончил редактирование, если хочешь повторить @kevin

Loop Eriksen 07.06.2019 16:49

Спасибо, теперь вижу :-)

Kevin 07.06.2019 16:52
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
3
30
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

 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

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

Большое спасибо, Кевин!

Loop Eriksen 07.06.2019 17:41

Другие вопросы по теме