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






Я вижу проблему в этих двух строках:
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
(все эти советы применимы и к вашей попытке, основанной на Процессе)
Большое спасибо, Кевин!