Найти - Пользователи
Полная версия: Объясните про loop!!!
Начало » Python для новичков » Объясните про loop!!!
1
r2d2_565
Добрый день!

В приложении которое я пишу есть два loop:
1. asyncore.loop()
2. root.mainloop()

Мне надо чтобы они работали вечно и одновременно. Как это сделать?
Пробовал вместо root.mainloop() ставить while true root.update() и тогда одно ядро получало 100% загрузки. Разве это правильно?
doza_and
r2d2_565
Разве это правильно?
Вам решать. Обычно так не делают. Обычно в loop делают функцию on idle в которой можно подергать чужой loop. в asyncio такого нет. Простейший вариант вызвать root.loop из run_in_executor
https://docs.python.org/3/library/asyncio-eventloop.html 18.5.1.13. Executor. Но тогда сами будете синхронизировать два цикла.. Возможен вариант когда вы после root.update() делаете await asincio.sleep(0.1) и даете процессору отдохнуть тоже самое но короче получится с call_later.
r2d2_565
Должен существовать какой-то способ, чтобы все события обрабатывались!

Например мне надо tk.mainloop(), который вызывает события мышки, клавы и отрисовки формы, но мне надо и чтобы событие прихода пакета на мой сокет тоже вызывалось сразу после завершения текущего задания.

Нельзя было сделать генеральный loop по всем событиям питона, чтобы ядро питона фильтровало windows messages и ставило их в питон очередь, а loop вызывал колбэки?

Как это сделать?


План Б: Проверять приход пакета на сокет по времени каждые 0.5 секунды tk.onidle, а на asynsock забыть.
PEHDOM
r2d2_565
Должен существовать какой-то способ, чтобы все события обрабатывались!
ну можно использовать потоки или процессы и организовать между ними взаимодействие, или писать свой велосипед mainloop.
Илил встроить ткмаинлуп в асинкио типа такого
http://www.pythonexample.com/code/python-tkinter-asyncio/
посмотрите еще тут
https://github.com/fluentpython/asyncio-tkinter
может чтто полезное найдете..
r2d2_565
Не работает почему-то.
Не показывает форму.
И глючит 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()
doza_and
r2d2_565
Как это сделать?
Я однажды делал так что asyncio mainloop был одновременно и gui event loop для wxpython. могу показать если надо. Делал естественно без тредов. Но для этого пришлось смотреть исходники wxpython. Аналогичная штука есть и для pyqt. Для Tkinter думаю никто этого не делал по причине бесполезности последнего в сложных gui проектах.

r2d2_565
ОС порождает события, дрова порождают события! Методы обрабатывают события! Пока питон не сделает нормальный обработчик событий он останется языком “для поиграться” и языком для изобретания обходов непредсказуемого поведения. И это должен быть первый параграф в мануале.

Тема закрыта.
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