Size: a a a

2021 November 19

Pavel Павлик in Python
Я вот смотрю, в доке сказано, что ctypes.CFUNCTYPE отпускает гил. Это точно нормально оборачивать им питоновскую функцию?
источник

L

L in Python
Это та же вакансия, я подправила под ваш формат
источник

ИВ

Илья Власов... in Python
Да, данная проблема только с None происходит, если создать любой другой объект и отдавать его, то проблем нету
import sys
import ctypes


class Baz:
   pass


FUNTYPE = ctypes.CFUNCTYPE(ctypes.py_object)


@FUNTYPE
def fun():
   ...
   return Baz


fun()
print(sys.getrefcount(Baz))
fun()
print(sys.getrefcount(Baz))
fun()
print(sys.getrefcount(Baz))
while True:
   fun()
источник

T

Tishka17 in Python
шутки ради, а если вернуть ...
источник

ИВ

Илья Власов... in Python
Тут запускается в одном потоке, гил тут не влияет
источник

L

L in Python
Нахуй идите
источник

B

Bayram in Python
😂😂😂
источник

ИВ

Илья Власов... in Python
Проблем тоже нету
источник

ИВ

Илья Власов... in Python
Проблема только и исключительно с None
источник

ИВ

Илья Власов... in Python
import sys
import ctypes


class Baz:
   pass


FUNTYPE = ctypes.CFUNCTYPE(ctypes.py_object)


@FUNTYPE
def fun():
   ...
   return ...


fun()
print(sys.getrefcount(...))
fun()
print(sys.getrefcount(...))
fun()
print(sys.getrefcount(...))
while True:
   fun()
Вот если что можно проверить у себя локально
источник

Pavel Павлик in Python
Скорее всего, тут проблема в том, что счетчик ссылок у None опускается до 0, чего быть не должно, и о чем тебе сообщается. С другими объектами просто может не детектится эта проблема
источник

T

Tishka17 in Python
как бысро падает?
источник

ИВ

Илья Власов... in Python
Да, я читал багтрекер питона и там чел потыкался в трейсбэк вызовов сишки и там вызывается функция dealloc_none, которая по идее должна отслеживать такие моменты, но она вызывается с параметром ignoring=true из-за чег ополучается ошибка
источник

ИВ

Илья Власов... in Python
в случае с None там пишет обычно о 5-6 тысячах ссылок и падает мгновенно
источник

ИВ

Илья Власов... in Python
На проде же падает не так быстро, но там и обработка не мгновенная
источник

Pavel Павлик in Python
Попробуй сделать объект, у которого не должен вызываться деструктор, и попробуй его задетектить его вызов
источник

T

Tishka17 in Python
хз, запустил этот код и он работает
источник

T

Tishka17 in Python
$ python3 denone.py 
7
7
7
источник

ИВ

Илья Власов... in Python
С ... и не падает, там рефкаунт одно и тоже число показывает
источник

D

D@VID in Python
источник