повысить питон с потоками - PullRequest
3 голосов
/ 14 января 2011

Кажется, что boost :: python и boost :: thread не очень нравятся друг другу, что я могу сказать.

Пожалуйста, обратитесь к http://pastebin.com/Cy123mJK

Это упрощениепроблемы, возникающие у меня с моим приложением boost :: python и boost :: thread.

Если кто-нибудь может сказать мне, почему возникают эти проблемы;Я понятия не имею, так как строго следю за тем, чтобы взаимодействие с python осуществлялось сразу с одним потоком.

В какой-то момент программа вылетает с ошибкой по непонятным причинам.Кроме того, невозможно поймать этот сбой, кажется ...

Помощь очень ценится!

1 Ответ

6 голосов
/ 22 января 2011

Вы запускаете python в нескольких потоках одновременно в Producer::run() и Consumer::run().

Если быть точным, вы запускаете это перед блокировкой мьютекса:

boost::python::object writer = this->k->Get<boost::python::object>("write");

Возможно, вы не понимали, что Boost в конце концов вызывает PyObject_GetItem, когда вы звоните boost::python::object::operator[](const std::string&) в Keeper::Get. Вам нужно переместить этот Get-вызов в правильное место после блокировки и перед использованием возвращенной функции:

{
  boost::mutex::scoped_lock l(this->k->python_keeper);
  boost::python::object writer = this->k->Get<boost::python::object>("write");
  writer(boost::python::str(os.str()));
}

Редактировать: Удалено Py_Finalize(). Да, вы правы, boost.python это не нравится.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...