Найти - Пользователи
Полная версия: threading с методом включающим в себя while true
Начало » Python для новичков » threading с методом включающим в себя while true
1
5am
Доброго времени суток,
начал изучать питон, разбираюсь с многопоточностью.
Столкнулся с такой проблемой:

нужно запустить 2 метода:
один из них постоянно выводит сообщение в консоль
второй читает значение из консоли.

сделал так:

import threading
from time import sleep
class WorkerWriter(threading.Thread):
    def __init__(self):
        print("worker writer created")
        threading.Thread.__init__(self)
        self.daemon = True
    def write_message(self):
        print("write message started")
        while True:
            print("some message")
            sleep(3)
class WorkerReader(threading.Thread):
    def __init__(self):
        print("worker reader created")
        threading.Thread.__init__(self)
        self.daemon = True
    def read_console(self):
        print("read console started")
        while True:
            command = input()
            if command == "exit":
                break
            print("your input: {0}".format(command))
if __name__ == "__main__":
    print("start")
    writer = WorkerWriter()
    writer._target = writer.write_message()
    writer.start() # or join
    print("started") # до этого метода выполнение не доходит

получается что до метода
print(“started”)
выполнение не доходит, упирается в бесконечный цикл. почему ?
ведь после запуска потока выполнение главного потока должно продолжится, а бесконечный метод должен крутиться в отдельном потоке.
pyuser
5am
writer._target = writer.write_message()
Вот здесь у Вас все и зависает :(, что в общем-то и не удивительно - Вы вызываете функцию, в теле которой бесконечный цикл.
Возможно Вы это имели в виду:
writer._target = writer.write_message
Только к чему такие извращения, не проще ли переопределить метод run?
5am
pyuser
writer._target = writer.write_message
в таком случаи он отрабатывает только 1 раз.

pyuser
Только к чему такие извращения, не проще ли переопределить метод run?
т.е. так ? в таком случаи опять же виснет на бесконечке writer'a

from threading import Thread
from time import sleep
def read_console():
    print("read console started")
    while True:
        command = input()
        if command == "exit":
            break
        print("your input: {0}".format(command))
def write_message():
    print("write message started")
    while True:
        print("some message")
        sleep(3)
if __name__ == "__main__":
    print("start")
    writer_thread = Thread(target=write_message())
    reader_thread = Thread(target=read_console())
    print("started")

задача:
добиться того, что бы:
read_console и write_message - работали одновременно.
5am
разобрался.
спасибо
    writer_thread = Thread(target=write_message)
    writer_thread.start()
    reader_thread = Thread(target=read_console)
    reader_thread.start()
pyuser
5am
разобрался.
Нет, не разобрались.
import threading
from time import sleep
class WorkerWriter(threading.Thread):
    def __init__(self):
        print("worker writer created")
        # threading.Thread.__init__(self)
        super().__init__()
        self.daemon = True
    def run(self):
        print("write message started")
        while True:
            print("some message")
            sleep(3)
class WorkerReader(threading.Thread):
    def __init__(self):
        print("worker reader created")
        # threading.Thread.__init__(self)
        super().__init__()
        self.daemon = True # тут нужно подумать, действительно ли Вы этого хотите
        # start можно делать здесь
    def run(self):
        print("read console started")
        while True:
            command = input()
            if command == "exit":
                break
            print("your input: {0}".format(command))
if __name__ == "__main__":
    print("start")
    writer = WorkerWriter()
    # writer._target = writer.write_message() # это лишнее
    writer.start() # or join # join будет ожидать завершения потока, с demon = True, если я все правильно понимаю, лишнее
    print("started") # до этого метода выполнение не доходит # теперь доходит ;)
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB