C код встроенной функции обратного вызова python и помещает данные в очередь python через обратный вызов, когда я получаю данные из очереди, это очень медленно.C код встроенная функция обратного вызова python
Пример:
с код, как этот
static int wrap_func(const int a, const unsigned char *b)
{
long ret;
PyObject *arglist;
PyObject * result = NULL;
arglist = Py_BuildValue("(s#)", b, a);
result = PyEval_CallObject(my_callback, arglist);
/* evaluate result or handle exception */
ret = PyInt_AsLong(result);
if (result == NULL)
return -1;
Py_DECREF(result);
return ret;
}
void produce_data()
{
while(1){
//produce data to buffer, len is buffer length
//call callback func
wrap_func(buffer, len);
}
}
собрать этот код на С так, как mywrap.so, и импортировать это так в Python код питона, например так:
import multiprocessing
import mywarp # mywrap.so
class WorkerThread_a(threading.Thread):
def __init__(self, workQueue):
threading.Thread.__init__(self)
self.workQueue = workQueue
self.setDaemon(True)
def run(self):
while 1:
try:
recvdata = self.workQueue.get(block=False)
except Queue.Empty:
continue
#do sth use recvdata
workQueue = multiprocessing.Queue()
def callback_func(a):
if a:
workQueue.put(a)
return 0
def main():
tmp = WorkerThread_a(workQueue)
tmp.start()
mywarp.set_callback(callback_func)
mywarp.decode_audio()
main()
В потоке python я получаю данные из очереди, но я получаю данные очень медленно, но в c, поэтому получаю данные и быстро помещаю их в очередь через функцию обратного вызова python.
Как я могу получить данные из очереди быстро, как в чистом коде python.
(Я редактировал это - мой исходный код был два макроса ошибочно, так что бы не сработало - извините!) – DavidW
ваше предложение замечательно, оно работает! Огромное спасибо. Я запускаю код как ваше предложение, оно работает, но когда я вставляю Py_BEGIN_ALLOW_THREADS в начале func и добавляю Py_END_ALLOW_THREADS перед возвратом. я запускаю его, это сегментный отказ, почему это? – ICYMYM
Это потому, что я ошибся! (теперь исправлено). Вам не разрешены вызовы api Python между 'Py_BEGIN_ALLOW_THREADS' и' Py_END_ALLOW_THREADS'. Таким образом, любая из функций, начинающихся с 'Py', не будет работать. К сожалению, ни один из этих кодов не может работать параллельно - я только что добавил место, где он может меняться между вашим модулем C и вашим кодом Python. – DavidW