Уведомления

Группа в Telegram: @pythonsu

#1 Май 13, 2018 13:17:17

r2d2_565
Зарегистрирован: 2018-04-28
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Объясните про loop!!!

Добрый день!

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

Мне надо чтобы они работали вечно и одновременно. Как это сделать?
Пробовал вместо root.mainloop() ставить while true root.update() и тогда одно ядро получало 100% загрузки. Разве это правильно?

Офлайн

#2 Май 13, 2018 18:23:02

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Объясните про loop!!!

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.



Отредактировано doza_and (Май 13, 2018 18:27:49)

Офлайн

#3 Май 14, 2018 13:07:31

r2d2_565
Зарегистрирован: 2018-04-28
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Объясните про loop!!!

Должен существовать какой-то способ, чтобы все события обрабатывались!

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

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

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


План Б: Проверять приход пакета на сокет по времени каждые 0.5 секунды tk.onidle, а на asynsock забыть.

Отредактировано r2d2_565 (Май 14, 2018 13:15:34)

Офлайн

#4 Май 14, 2018 16:00:22

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Объясните про loop!!!

r2d2_565
Должен существовать какой-то способ, чтобы все события обрабатывались!
ну можно использовать потоки или процессы и организовать между ними взаимодействие, или писать свой велосипед mainloop.
Илил встроить ткмаинлуп в асинкио типа такого
http://www.pythonexample.com/code/python-tkinter-asyncio/
посмотрите еще тут
https://github.com/fluentpython/asyncio-tkinter
может чтто полезное найдете..



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Май 14, 2018 16:16:28)

Офлайн

#5 Май 15, 2018 13:22:37

r2d2_565
Зарегистрирован: 2018-04-28
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Объясните про loop!!!

Не работает почему-то.
Не показывает форму.
И глючит 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()

Офлайн

#6 Май 16, 2018 00:02:02

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Объясните про loop!!!

r2d2_565
Как это сделать?
Я однажды делал так что asyncio mainloop был одновременно и gui event loop для wxpython. могу показать если надо. Делал естественно без тредов. Но для этого пришлось смотреть исходники wxpython. Аналогичная штука есть и для pyqt. Для Tkinter думаю никто этого не делал по причине бесполезности последнего в сложных gui проектах.



Офлайн

#7 Май 16, 2018 10:00:34

r2d2_565
Зарегистрирован: 2018-04-28
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Объясните про loop!!!

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

Тема закрыта.

Отредактировано r2d2_565 (Май 16, 2018 11:28:19)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version