Форум сайта python.su
0
Добрый день!
В приложении которое я пишу есть два loop:
1. asyncore.loop()
2. root.mainloop()
Мне надо чтобы они работали вечно и одновременно. Как это сделать?
Пробовал вместо root.mainloop() ставить while true root.update() и тогда одно ядро получало 100% загрузки. Разве это правильно?
Офлайн
253
r2d2_565Вам решать. Обычно так не делают. Обычно в loop делают функцию on idle в которой можно подергать чужой loop. в asyncio такого нет. Простейший вариант вызвать root.loop из run_in_executor
Разве это правильно?
Отредактировано doza_and (Май 13, 2018 18:27:49)
Офлайн
0
Должен существовать какой-то способ, чтобы все события обрабатывались!
Например мне надо tk.mainloop(), который вызывает события мышки, клавы и отрисовки формы, но мне надо и чтобы событие прихода пакета на мой сокет тоже вызывалось сразу после завершения текущего задания.
Нельзя было сделать генеральный loop по всем событиям питона, чтобы ядро питона фильтровало windows messages и ставило их в питон очередь, а loop вызывал колбэки?
Как это сделать?
План Б: Проверять приход пакета на сокет по времени каждые 0.5 секунды tk.onidle, а на asynsock забыть.
Отредактировано r2d2_565 (Май 14, 2018 13:15:34)
Офлайн
294
r2d2_565ну можно использовать потоки или процессы и организовать между ними взаимодействие, или писать свой
Должен существовать какой-то способ, чтобы все события обрабатывались!
[code python][/code]
Отредактировано PEHDOM (Май 14, 2018 16:16:28)
Офлайн
0
Не работает почему-то.
Не показывает форму.
И глючит poll
Серверная часть:
from tkinter import Tk import socket class MyServ: def __init__(self, master): self.master=master self.s=socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.s.bind(('', 20000)) self.s.listen(1) self.conn, self.addr=self.s.accept() self.poll() def poll(self): print(1) if self.conn: self.data=self.conn.recv(1024) if self.data: print(self.data) self.master.after(1000, self.poll) root=Tk() serv=MyServ(root) root.mainloop()
import socket sock=socket.socket() sock.connect(('127.0.0.1', 20000)) sock.send(b'Hello') sock.send(b'Hello') sock.send(b'Hello') sock.close()
Офлайн
253
r2d2_565Я однажды делал так что asyncio mainloop был одновременно и gui event loop для wxpython. могу показать если надо. Делал естественно без тредов. Но для этого пришлось смотреть исходники wxpython. Аналогичная штука есть и для pyqt. Для Tkinter думаю никто этого не делал по причине бесполезности последнего в сложных gui проектах.
Как это сделать?
Офлайн
0
ОС порождает события, дрова порождают события! Методы обрабатывают события! Пока питон не сделает нормальный обработчик событий он останется языком “для поиграться” и языком для изобретания обходов непредсказуемого поведения. И это должен быть первый параграф в мануале.
Тема закрыта.
Отредактировано r2d2_565 (Май 16, 2018 11:28:19)
Офлайн