Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 4, 2015 12:45:57

mitya_s_v
Зарегистрирован: 2014-09-10
Сообщения: 64
Репутация: +  4  -
Профиль   Отправить e-mail  

Уведомить основную программу о совершении какого-то действия

Есть функция, которая в отдельном потоке качает файлы, хочу сделать progressbar. В связи с этим встал вопрос как уведомить программу о том, что очередной файл скачался.
В pyqt можно было-бы использовать сигналы, а как решить эту задачу используя стандартную библиотеку не знаю. В какую сторону курить?

P.S предполагаю, что это можно решить с помощью callback функции, но не уверен, что это тут уместно и нормальная это практика или нет?

Отредактировано mitya_s_v (Янв. 4, 2015 12:47:10)

Офлайн

#2 Янв. 4, 2015 13:01:05

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Уведомить основную программу о совершении какого-то действия

mitya_s_v
может быть посмотреть на модуль signal ?



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#3 Янв. 4, 2015 13:04:40

mitya_s_v
Зарегистрирован: 2014-09-10
Сообщения: 64
Репутация: +  4  -
Профиль   Отправить e-mail  

Уведомить основную программу о совершении какого-то действия

Не знал о таком, сейчас гляну. Кстати, вообще по логике ещё для этого может подойти стандартный механизм исключений.
Хотелось бы узнать, можно его использовать для моих целей. Я где-то вроде читал, что это приемлемая практика.

Офлайн

#4 Янв. 4, 2015 14:34:40

mitya_s_v
Зарегистрирован: 2014-09-10
Сообщения: 64
Репутация: +  4  -
Профиль   Отправить e-mail  

Уведомить основную программу о совершении какого-то действия

JOHN_16
А кроме модуля signal как ещё можно обмениваться данными между потоками?

Офлайн

#5 Янв. 4, 2015 16:21:29

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9894
Репутация: +  854  -
Профиль   Отправить e-mail  

Уведомить основную программу о совершении какого-то действия

mitya_s_v
как ещё можно обмениваться данными между потоками?
Неблокирующая очередь queue.Queue()
пример



Офлайн

#6 Янв. 4, 2015 18:42:21

mitya_s_v
Зарегистрирован: 2014-09-10
Сообщения: 64
Репутация: +  4  -
Профиль   Отправить e-mail  

Уведомить основную программу о совершении какого-то действия

py.user.next
Неблокирующая очередь queue.Queue()
Да это самый широко освещённый способ. Мне его применять не особо хочется. Нужно будет проверять по таймеру эту очередь и т д
В идеале хочется найти аналог сигналов pyqt, но похоже такого нет

Какие варианты есть кроме объекта в глобальной области видимости (имею ввиду queue.Queue())?

Офлайн

#7 Янв. 4, 2015 19:55:36

Alen
Зарегистрирован: 2013-08-01
Сообщения: 373
Репутация: +  49  -
Профиль   Отправить e-mail  

Уведомить основную программу о совершении какого-то действия

mitya_s_v
Какие варианты есть кроме объекта в глобальной области видимости (имею ввиду queue.Queue())?

Queue не обязательно должна находится в глобальной области видимости, можно её передавать как параметр между функциями. Также рекомендую посмотреть этот код:
http://stackoverflow.com/questions/375427/non-blocking-read-on-a-subprocess-pipe-in-python

Ну а варианты кроме процессов и потоков – любая асинхронная библиотека, например gevent.

Офлайн

#8 Янв. 4, 2015 20:39:44

4kpt_III
Зарегистрирован: 2014-12-22
Сообщения: 999
Репутация: +  39  -
Профиль   Отправить e-mail  

Уведомить основную программу о совершении какого-то действия

Alen
Ну а варианты кроме процессов и потоков – любая асинхронная библиотека, например gevent.

Согласен полностью. Не потоками едиными. Хотел только заметить, что Светлов писал про gevent. Вроде как он не есть гуд и может ломаться в самый неподходящий момент. Но, как я понимаю, все зависть от задач. Я больше использую tornado. Когда-то пробовал твистед, но он у меня не пошел.

P.S. Жаль, что asyncio только на 3.4 и выше…

Офлайн

#9 Янв. 5, 2015 02:23:59

mitya_s_v
Зарегистрирован: 2014-09-10
Сообщения: 64
Репутация: +  4  -
Профиль   Отправить e-mail  

Уведомить основную программу о совершении какого-то действия

4kpt_III
Я больше использую tornado. Когда-то пробовал твистед
Думаю это не для моего случая. Это слишком огромные проекты, чтобы с помощью их просто скачать несколько файлов.
Но за совет спасибо.

4kpt_III
P.S. Жаль, что asyncio только на 3.4 и выше…
А в asyncio есть нужные мне инструменты?

Офлайн

#10 Янв. 5, 2015 02:50:17

4kpt_III
Зарегистрирован: 2014-12-22
Сообщения: 999
Репутация: +  39  -
Профиль   Отправить e-mail  

Уведомить основную программу о совершении какого-то действия

mitya_s_v
А в asyncio есть нужные мне инструменты?

Простите за оффтоп. Это я общался с Alen. По вашему вопросу. Я бы посмотрел вот вот этот интересный пост. А так вообще конечно зависит от задачи. Если там действительно нужно скачать небольшое количество файлов небольшого размера, то может и треды не нужны? Все зависит от задачи. Вообще если есть тяжелые задачи и необходимо их решать отдельно от основного процесса и основной процесс от них не сильно то и зависим, то используют специальные инструменты.

P.S. Asincio не намного меньше

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version