
Centrino
05.07.2017
14:44:14
если поток один, то откуда ускорение?

Nikolay
05.07.2017
14:45:08
суть корутин в том, что поскольку они управляют переключением контекста сами (yield/await явно возвращает управление, это называется кооперативная многозадачность), то и проблем многих с блокировками, которые присущи многопоточному программированию, у них нет

Маришка
05.07.2017
14:45:42

Nikolay
05.07.2017
14:46:12
если поток один, то откуда ускорение?
ускорение оттуда, что 1) тебе не нужен системный шедулер ждать для управления тредами, 2) твоя программа "проматывает" состояние корутин до нового исходя из событий, которые к ней извне приходят

Google

Nikolay
05.07.2017
14:46:19
например, из сокетов
то есть операционная система сама отправляет сигнал программе о том, что надо запустить новый обработчик, а не программа ждет, пока данные к ней придут, тратя ресурсы

Centrino
05.07.2017
14:47:32
то есть я не смогу получить ускорения, если вместо тредов, буду использовать корутины, например для вычислений в самом питон-коде?

Nikolay
05.07.2017
14:48:52
другое дело, что зачем тебе программа, которая никак не взаимодействует с внешним миром?

Centrino
05.07.2017
14:49:14
например, 10 больших факториалов.
Тогда взять треды, да?

Artem
05.07.2017
14:49:27

Nikolay
05.07.2017
14:49:33
тогда ты берешь тот же scipy, который написан на сях

Centrino
05.07.2017
14:49:47
а в чем разница в питоне между тредами и потоками?
есть разные библиотеки для того и другого

Nikolay
05.07.2017
14:49:51
и просто дергаешь из него нужные методы
concurrent.futures и threading - это просто два разных интерфейса

Google

Aleksandr
05.07.2017
14:50:22

Nikolay
05.07.2017
14:50:56
и да, суть вызова сишных либ в том, что, когда ты исполняешь их код, а не питоновый - отпускается GIL

Маришка
05.07.2017
14:51:09
да начнётся срач, пришёл Александр

Nikolay
05.07.2017
14:51:21
(это помимо того, что сами сишные либы работают на порядок быстрее, чем питонокод, чаще всего)

Centrino
05.07.2017
14:51:25
пытаюсь понять как работает корутина в одном потоке, осмыслить

Nikolay
05.07.2017
14:51:35
это цикл, который слушает события, которые к нему приходят от операционки

Centrino
05.07.2017
14:52:15
yield я пишу, функция возвращает результат и дальше выполняться продолжает. А как же тот, кто ждет его ответа?

Nikolay
05.07.2017
14:52:41
соответственно, ты можешь этому лупу сказать, чтобы в качестве реакции на разные типы событий он тебе дергал разный код

Маришка
05.07.2017
14:52:52

Aleksandr
05.07.2017
14:52:53

Nikolay
05.07.2017
14:52:56
она запоминает, где остановилась, и возвращает временно управление
то есть корутины постоянно помнят, где остановились, и просто друг другу из рук в руки передают текущий поток выполнения

Маришка
05.07.2017
14:54:07

Centrino
05.07.2017
14:54:32
спасибо, кажется я начинаю понимать
смотрел это видео

Nikolay
05.07.2017
14:55:12

Centrino
05.07.2017
14:55:16
но моего анлийского не хватает

Google


Nikolay
05.07.2017
14:55:44
первая - тебе надо руками создавать объект эвентлупа всегда в текущем потоке. Если у тебя потоков несколько (что редко нужно, но тем не менее) - то в каждом отдельно свой луп.
вторая - если ты объявляешь функцию, как async, то она не должна дергать ничего из того, что долго и синхронно выполняется, внутри себя, потому что это не позволит ей передать управление дальше и завесит весь процесс целиком
соответственно, ты можешь "зааутсорсить" долгую процедуру, запустив ее в отдельном потоке (если она совсем чисто I/O Bound) или процессе (если там есть много питонокода, который может попасть под GIL)
это делается с помощью вызова asyncio.run_in_executor()
в других языках подобные вещи реализованы иначе немного, скажем, в го вообще нет разницы между синхронным и асинхронным кодом (не надо явно объявлять функции асинхронными и нет GIL), поэтому там о таких вещах можно вообще не думать обычно
в питоне чуть сложнее, но, в целом, если примерно вникнешь, как оно работает - то нормально
ну и да, корутины всегда запускаются ТОЛЬКО в лупе


Makc
05.07.2017
15:01:36
можно как-то запретить setuptools исколькозать easy_install?

Nikolay
05.07.2017
15:02:05
поясни вопрос

Makc
05.07.2017
15:02:29
easy_install != setuptools

Centrino
05.07.2017
15:02:50

Nikolay
05.07.2017
15:03:00

Makc
05.07.2017
15:03:17
Сетаптулс используется для подтягивания ависимостей easy_install, что неприемлимо в моём случае

Nikolay
05.07.2017
15:03:18

Centrino
05.07.2017
15:04:07

Nikolay
05.07.2017
15:04:21

Centrino
05.07.2017
15:04:40
да. Надо еще дома будет покодить примеры какие-нибудь

Makc
05.07.2017
15:05:44
Easy Install is a python module (easy_install) bundled with setuptools that lets you automatically download, build, install, and manage Python packages.

Google

Nikolay
05.07.2017
15:06:06

Makc
05.07.2017
15:06:22
Причем интерфейсы взаимодействия с pypi у низ разные

Nikolay
05.07.2017
15:06:25
ты давай лучше расскажи, какую задачу решить пытаешься

Makc
05.07.2017
15:06:29
Насколько я понимаю

Nikolay
05.07.2017
15:06:36
чтобы зависимости не качались или что?

Makc
05.07.2017
15:06:52
Есть локальный pypi

Nikolay
05.07.2017
15:06:59
pypiserver?

Makc
05.07.2017
15:07:06
arifactory

Nikolay
05.07.2017
15:07:11
окей

Admin
ERROR: S client not available

Makc
05.07.2017
15:07:32
Который судя по всему не поддерживает easy_install index

Nikolay
05.07.2017
15:08:07
в артефактах хранится информация об их зависимостях?
то есть ты можешь одной командой скачать пакет и все его зависимости в папочку?

Makc
05.07.2017
15:08:37
Причём тут зависимости?

Nikolay
05.07.2017
15:09:10
тебе надо, чтобы зависимости пакета тянулись из артифактори, а не искались на pypi, так?
или нет?

Makc
05.07.2017
15:09:37
дело в том что если я указываю
[easy_install]
index_url =
https://art.company.ru/pypi/simple/
То он вообще не может оттуда притянуть пакеты
В отличае от pip

Nikolay
05.07.2017
15:10:36
ну да, в общем случае easy_install и не нужен нафиг, если есть pip

Google

Nikolay
05.07.2017
15:11:41
для pip ты можешь сделать ~/.pip/pip.conf, в котором указать кастомные урлы

Makc
05.07.2017
15:12:11
Это и так понятно.
Теперь можно вренутся к первому вопросу
setuptools по умолчанию использует easy_install

Nikolay
05.07.2017
15:13:24
у тебя есть setup.py
чем ты его запустишь - тем он и будет дергаться

Makc
05.07.2017
15:13:48
делая python setup.py test

Nikolay
05.07.2017
15:14:27

Makc
05.07.2017
15:14:33
если у тебя есть tests_requires ты так или иначе будешь их тянуть easy_install ом

Nikolay
05.07.2017
15:14:42
а тьфу
понял
ну, ты можешь просто тесты по-другому запускать
это будет самое простое решение

Makc
05.07.2017
15:16:35
Это по меньшей мере странно.

Nikolay
05.07.2017
15:16:44
почему?
ты можешь пакет поставить одним инсталлятором или другим

Makc
05.07.2017
15:17:32
Ну учитывая что setuptools стандарт для задач дистрибуции

Nikolay
05.07.2017
15:18:18
а вот и ответ на твой вопрос
https://www.jfrog.com/jira/browse/RTFACT-8216
вкратце "юзай pip"

Makc
05.07.2017
15:18:45
Это вопрос на мой вопрос скорее)