Асинхронная функция Python как обратный вызов CPython

Программы на Python
Ответить
Anonymous
 Асинхронная функция Python как обратный вызов C

Сообщение Anonymous »

Я нахожусь в ситуации, когда мне нужно использовать библиотеку C, которая вызывает функцию Python для целей ввода-вывода, поэтому мне не нужно создавать эквивалент C для ввода-вывода. В базе кода Python широко используется asyncio, и все операции ввода-вывода проходят через очереди. И код C загружается как dll с использованием ctypes. Проблема в том, что вы не можете дождаться обратного вызова C. Можно ли как-нибудь использовать асинхронную функцию Python в качестве обратного вызова C?
Ниже показано, как она будет работать. Мой единственный вариант - сделать что-то вроде non_async_callback или есть ли способ дождаться от C, используя ctypes.
python
import asyncio
import time
import ctypes

DLL_PATH="./bin/test.dll"

dll = ctypes.CDLL(DLL_PATH)
incoming_queue=asyncio.Queue()
outgoing_queue=asyncio.Queue()

c_func = ctypes.CFUNCTYPE(ctypes.c_uint8, ctypes.c_uint8)

async def python_callback(test_num):
await outgoing_queue.put(test_num)
test_num = await incoming_queue.get()
return test_num

def non_async_callback(test_num):
while True:
try:
outgoing_queue.put_nowait(test_num)
break
except asyncio.QueueFull:
time.sleep(0.1)
continue

while True:
try:
test_num = incoming_queue.get_nowait(test_num)
break
except asyncio.QueueFull:
time.sleep(0.1)
continue

return test_num

# Called at some point during initialization
def setup_callback():
dll.setup_callback(c_func(python_callback))

C
uint8_t (CALLBACK*)(uint8_t);
CALLBACK py_callback

void setup_callbacks(void* callback)
{
py_callback = callback;
}

// Called from somewhere else in the C code.
uint8_t python_callback(uint8_t value)
{
uint8_t result = py_callback(value);
// Do something with result
}


Подробнее здесь: https://stackoverflow.com/questions/792 ... c-callback
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»