Nightpoison Ответов: 0

Питон-обертка отправить &амп; получать за трубы() многопроцессорная обработка?


У меня есть оболочка python, содержащая некоторый код c++. В нем есть функция, которую я настраиваю как процесс из моего кода python. Это утверждение while, что мне нужно настроить условие для того, когда он должен закрыться.

утверждение while более или менее таково

while(TERMINATE == 0)


У меня есть данные, которые отправляются обратно из цикла while. Я использую pipe() для создания объектов " in " и "out". Я посылаю объект "out" в функцию, когда создаю процесс.

self.stream = Process(target=fxn, args=(self.outPipe,))


находясь внутри оболочки, я могу отправлять данные обратно в скрипт python с помощью

PyObject *send = Py_BuildValue("s", "send_bytes");
PyObject_CallMethodObjArgs(pipe, send, temp, NULL);


Это работает просто отлично.

Однако у меня возникли проблемы с отправкой сообщения в код C++ в оболочке, которое говорит циклу остановиться.

Что я уже пробовал:

То, что я решил сделать, это просто проверить poll(). Когда система видит, что есть входящий сигнал от скрипта python, она устанавливает TERMINATE = 1. поэтому я написал это.

PyObject *poll = Py_BuildValue("p", "poll");


p (bool) [int]
Tests the value passed in for truth (a boolean predicate) and converts the result to its equivalent C true/false integer value. Sets the int to 1 if the expression was true and 0 if it was false. This accepts any valid Python value. See Truth Value Testing for more information about how Python tests values for truth.


Поскольку я ожидаю true или false от функции python poll(). Я решил, что "p" будет идеальным, так как он преобразует true в 1 и false в 0.

в петле у меня есть

if(PyObject_CallMethodObjArgs(pipe, poll, NULL, NULL))
		        TERMINATE = 1;


Я хотел использовать poll() в качестве его неблокирующего, как recv (). Таким образом, я мог бы просто заняться своей другой работой и проверять poll() один раз в цикл.

однако, когда я посылаю сигнал из скрипта python, он никогда не срабатывает.

self.inPipe.send("Hello");

0 Ответов