@ru_python

Страница 7114 из 9768
BlackAndOrange
21.11.2018
12:31:11
А, извиняюсь, с чего они должны конфликтовать?
Потому что asyncio внутри себя использует epoll

А epoll опирается на файловые дескрипторы

Google
Ilia
21.11.2018
12:31:33
И ?

BlackAndOrange
21.11.2018
12:31:37
А файловые дескрипторы внутри одного процесса одни и те же

Кажется, asyncio тупо перехватывает всё происходящее и до сторонней библиотеки ничего не доходит.

Список наблюдения внутри одного процесса один

Ilia
21.11.2018
12:32:28
Ну, да, НАБОР их один и тот же, но epoll -то те дескрипторы, с которыми работает, явно принимает.

BlackAndOrange
21.11.2018
12:32:41
Соответственно, asyncio делая epoll_wait(), получает все ивенты

В том числе те, которые нужны не ему

Ilia
21.11.2018
12:33:05
Сейчас, я только уточню...

Cykooz
21.11.2018
12:35:20
Проблематично, asyncio запускается почти сразу
Если не ошибаюсь, то запускать его должен ты сам из своего кода. Там даже евент-луп не создаётся сам без пинка. Так что ты вполне можешь свой код запуска поправить так, что бы первое что он делал - запускал доп. процессы, и только потом начинал инициализацию приложения и его запуск

Ilia
21.11.2018
12:35:59
epol_create же создаёт дескриптор epoll-структуры, в рамках которой идёт вся дальнейшая работа, вроде бы. Две части программы должы создавать каждая свой дескриптор, и они не должны конфликтовать, по идее. Может там что-то другое?

Cykooz
21.11.2018
12:37:46
Вероятно у него проблема в том, что два "евент-лупа" в одном процессе (и треде) в принципе не могут работать "параллельно". Работать будет только один из них.

Google
Cykooz
21.11.2018
12:39:04
Что бы можно было встроится, надо что бы твоя старая либа использовала event-loop от asyncio, или наоборот

По другому - только через треды или процессы

Cykooz
21.11.2018
12:40:55
>>> os.listdir('/proc/13092/fd') ['0', '1', '2', '3'] >>> import asyncio >>> os.listdir('/proc/13092/fd') ['0', '1', '2', '3', '4'] >>> asyncio засирает fd самим фактом своего импорта
Тогда не импортируй его раньше времени. Сделай стартовую функцию изолированной, что бы она запускала в отдельном процессе другую функцию, которая внутри себя уже импортирует то что нужно и запускает

Ilia
21.11.2018
12:40:58
Скорее всего это epoll оно и создаёт

BlackAndOrange
21.11.2018
12:41:13
Скорее всего это epoll оно и создаёт
Вот именно И второй epoll после этого нормально не работает

Stannis
21.11.2018
12:41:35
Объясните пожалуйста еще один момент Накой нужен WSGI есть все фреймворки умеют биндится на TCP порт. Или с WSGI может выдержать больше соединений чем тот же Фласк или Торнадо?

BlackAndOrange
21.11.2018
12:41:40
Ну, с чего ты это взял-то?
Выяснил эмпирическим путём

Cykooz
21.11.2018
12:42:30
Ни треды, ни процессы не спасают, потому что шарят один и тот же fd
В asyncio вроде как можно создавать новые евент-лупы. Я правда не уверен - создаётся ли при этом новый дескриптор для epoll-а, или они шарят общий.

Ilia
21.11.2018
12:42:32
Выяснил эмпирическим путём
Ну, иногда эмпирический путь не работает...

Aleksandr
21.11.2018
12:42:41
Подскажите как сделать ассоциативный массив? d [a][]= prop

Cykooz
21.11.2018
12:43:11
Я точно знаю, что можно в разных тредах запустить разные евент-лупы и они будут работать независимо

El Mariachi
21.11.2018
12:43:30
BlackAndOrange
21.11.2018
12:43:32
Разные ивент-лупы могут запросто шарить один epoll

Google
Tony
21.11.2018
12:44:18
d = {} d['a'] = 1
d = {“a”: 1}

BlackAndOrange
21.11.2018
12:44:33
Факт в том, что asyncio так или иначе ломает работу epoll

Я проверил это на минимальном примере

Ilia
21.11.2018
12:44:38
Разные ивент-лупы могут запросто шарить один epoll
Почему ты думаешь, что две части программы вдруг бац-- и начнут ни с того ни с сего использовать один и тот же кусок данных в памяти?

Aleksandr
21.11.2018
12:45:09
так и сделать, d = {} d[a] = prop
а - prop1 а - prop2 мне нужно как-то сохранить d[а][prop1, prop2]

у а 10 свойств и все их нужно в одном списке сохранить

El Mariachi
21.11.2018
12:45:51
Ilia
21.11.2018
12:46:32
Потому что epoll — это не кусок данных в памяти, это файл.
Ну его же надо открыть как файл и потом с ним работать, а потом закрыть. Ты представь программу, которая пишет в уже открытый чужоё файл...

Aleksandr
21.11.2018
12:46:32
У меня цикл... сначало prop1 потом на след итерации prop2

Aleksandr
21.11.2018
12:46:46
d[a] = [prop] ?

BlackAndOrange
21.11.2018
12:46:49
Файловые дескрипторы шарятся между процессами

Автоматически

Пруф: подпроцесс может писать на STDOUT

Ilia
21.11.2018
12:47:11
Это не чужой файл
Ок, давай по-другому. Эта старая библиотека -- это что?

BlackAndOrange
21.11.2018
12:47:31
Ок, давай по-другому. Эта старая библиотека -- это что?
Библиотека на epoll для взаимодействия с одной специфической железкой

Ilia
21.11.2018
12:47:44
Файловые дескрипторы шарятся между процессами
С этим я не спорю. Но только не автоматически, а при создании дочернего процесса только . После - нет

El Mariachi
21.11.2018
12:47:44
Google
BlackAndOrange
21.11.2018
12:48:03
Cykooz
21.11.2018
12:48:46
Библиотека на epoll для взаимодействия с одной специфической железкой
В общем разбирайся с процессами/тредами, ищи способ обойти "шареные" дескрипторы. В одном треде не может параллельно работать два евент лупа, т.к. евент луп по факту - это синхронный бесконечный цикл.

BlackAndOrange
21.11.2018
12:49:03
Пока копаю в сторону https://www.python.org/dev/peps/pep-0433/

Ilia
21.11.2018
12:49:47
Библиотека на epoll для взаимодействия с одной специфической железкой
Я просто только один вариант того, как это работает, знаю, но тогда эту библиотеку надо просто выжечь с лица земли ядерным лазером...

Ilia
21.11.2018
12:51:35
Пока копаю в сторону https://www.python.org/dev/peps/pep-0433/
Файловые дескрипторы наследует дочерний процесс от родительского ТОЛЬКО в момент создания. После этого они уже разные будут

Andrew
21.11.2018
12:51:39
Проблематично, asyncio запускается почти сразу
Форкнулся - закрыл дескрипторы

Ilia
21.11.2018
12:51:57
BlackAndOrange
21.11.2018
12:52:03
Ilia
21.11.2018
12:52:15
Ты ж видел, 4ый

Aleksandr
21.11.2018
12:52:24
блджад d['a'] = [] d['a'].append(prop_n)
File "path2str.py", line 25, in <module> d[art].append(url) KeyError: '\xd0\x94417' По сути d[Д047].append(http://site)

BlackAndOrange
21.11.2018
12:52:25
Ты ж видел, 4ый
Ну так это в рафинированном примере

В продакшне я б на это не расчитывал особо

Ilia
21.11.2018
12:52:59
Просто твоя библиотека видимо в таблицу дескрипторов открытых файлов из CRT напрямую лазит... Ну, я б за такое просто кочергу в зад...

Cykooz
21.11.2018
12:53:14
Найти б ещё который
Питон сам по себе ничего не импортирует. То что у тебя asyncio импортируется раньше чем будет запущена "стартовая" функция - это ты вполне можешь разрулить.

Ilia
21.11.2018
12:53:57
В продакшне я б на это не расчитывал особо
Ты значешь, что должен делать дочерний процесс. Ты можешь выявить все файлы, которые ему нужны. 1, 2, 3-ий -- нужны точно. Все остальные можешь закрывать

BlackAndOrange
21.11.2018
12:54:16
Питон сам по себе ничего не импортирует. То что у тебя asyncio импортируется раньше чем будет запущена "стартовая" функция - это ты вполне можешь разрулить.
Могу, не спорю. Но это чревато очень неинтуитивным поведением кода. Какой-нибудь новичок импортирует asyncio в новом модуле и ВНЕЗАПНО перестанет работать вообще левая библиотека

Google
El Mariachi
21.11.2018
12:54:27
Aleksandr
21.11.2018
12:54:47
русская кодировка в UTF

Ilia
21.11.2018
12:55:01
Питон сам по себе ничего не импортирует. То что у тебя asyncio импортируется раньше чем будет запущена "стартовая" функция - это ты вполне можешь разрулить.
Так импорт в питоне же -- выполняемый оператор, его можно НЕ В САМОМ НАЧАЛЕ делать, а СРАЗУ ПОСЛЕ FORK-а, например, в родительском процессе

El Mariachi
21.11.2018
12:56:00
Казимир
21.11.2018
12:59:05
Всем привет! Как запустить метод класса асинхронно/в другом потоке?

El Mariachi
21.11.2018
13:01:50
так асинхронно или в другом потоке?

Alex
21.11.2018
13:02:15
Всем привет! Как запустить метод класса асинхронно/в другом потоке?
много способов. например создать поток при помощи threading.Thread(target=callable, args=..., kwargs=...)

Aleksandr
21.11.2018
13:03:24
art.decode('utf-8')
d["art"].append(url) KeyError: 'art'

Alex
21.11.2018
13:04:31
d["art"].append(url) KeyError: 'art'
у тебя в словаре нет ключа 'art'. откуда он берется?

El Mariachi
21.11.2018
13:05:00
он d['art'] = [] забыл написать )

Ilia
21.11.2018
13:06:00
Ilia
21.11.2018
13:06:20
Типа "учебник не читал, но написать надо"?

Alex
21.11.2018
13:06:58
это везде так... я вчера уже сокрушался по поводу новичков

Ilia
21.11.2018
13:07:11
Ох...

Alex
21.11.2018
13:07:12
новички никогда не меняются

El Mariachi
21.11.2018
13:07:36
новички никогда не меняются
ну... не надо уж всех под одну гребенку

Alex
21.11.2018
13:07:41
на правах пятничного флейма, вспоминая времена когда интернет был не у всех и медленный... прекрасные же были времена.

El Mariachi
21.11.2018
13:07:44
новички тоже разные бывают

Страница 7114 из 9768