将多个C ++生产者的数据传递给Python使用者

时间:2019-05-08 08:39:52

标签: c++ python-3.x multithreading producer-consumer gil

我尝试通过多个同时运行的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

0 个答案:

没有答案