Форум сайта python.su
0
Доброго времени суток,
начал изучать питон, разбираюсь с многопоточностью.
Столкнулся с такой проблемой:
нужно запустить 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") # до этого метода выполнение не доходит
Офлайн
36
5amВот здесь у Вас все и зависает :(, что в общем-то и не удивительно - Вы вызываете функцию, в теле которой бесконечный цикл.writer._target = writer.write_message()
writer._target = writer.write_message
Офлайн
0
pyuserв таком случаи он отрабатывает только 1 раз.
writer._target = writer.write_message
pyuserт.е. так ? в таком случаи опять же виснет на бесконечке writer'a
Только к чему такие извращения, не проще ли переопределить метод run?
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")
Офлайн
0
разобрался.
спасибо
writer_thread = Thread(target=write_message) writer_thread.start() reader_thread = Thread(target=read_console) reader_thread.start()
Офлайн
36
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") # до этого метода выполнение не доходит # теперь доходит ;)
Отредактировано pyuser (Апрель 13, 2013 05:48:06)
Офлайн