我尝试通过多个同时运行的C ++线程(通过Boost.Python)扩展Python线程。一旦启动,C ++线程将无限期运行,生成数据(例如随机数),并将此数据传递回Python线程。因此,这是一个多生产者/单消费者场景,生产者使用C ++编写,而消费者使用Python编写。 有什么办法吗?可以将一个队列从C ++暴露给Python线程吗?
我看到了许多解决方案(例如this),这些解决方案是从Python输入C ++扩展名,释放GIL,创建并行C ++线程,在没有GIL的情况下并行运行这些线程,终止并将结果返回给Python代码。但是,它们不会无限运行C ++线程,也不使用队列将数据传递回Python线程。
这是我要完成的纯C ++版本。 main
中的所有内容都应移入Python主线程,并且队列应将C ++线程与Python主线程“连接”。
std::vector< Queue<int> *> packet_queues;
void cpp_thread(int thread_id) {
int counter = 0;
while(1) {
counter++;
packet_queues[thread_id]->push(counter);
}
}
np::ndarray get_packet(void) {
np::ndarray packet = np::zeros(p::make_tuple(packet_queues.size()), np::dtype::get_builtin<int>());
for(int i = 0; i < packet_queues.size(); i++) {
int counter;
packet_queues[i]->pop(counter);
packet[i] = counter;
}
return packet;
}
int main(int argc, char **argv)
{
// creates Queues
for (int i = 0; i < 10; i++) {
packet_queues.push_back(new Queue<int>());
}
// start C++ threads
std::vector<std::thread *> cpp_threads;
for(int i = 0; i < 10; i++) {
cpp_threads.push_back(new std::thread(cpp_thread, i));
}
while (1) {
np::ndarray packet = get_packet();
std::cout << "Packet :: " << p::extract<char const *>(p::str(packet)) << std::endl;
}
// join cpp threads
for(int i = 0; i < cpp_threads.size(); i++) {
cpp_threads[i]->join();
delete cpp_threads[i];
}
return 0;
}
使用的Queue实现为this one。