数据部分:
static Market market;
// boost::asio::thread_pool thread_pool;
static std::unordered_map < std::string, std::unordered_map < std::string,
std::pair < Market::path_t, std::string > > > data; // future
Python设置:
static Python_Initializer python_initializer;
static boost::python::object global = boost::python::import("__main__").attr("__dict__");
boost::python::exec("from analysis.src.main import run", global, global);
static boost::python::object module = global["run"];
在Python_Initializer被称为Py_Initialize。static这里和数据部分需要避免重新构造对象,因为 此代码放置在从外部循环调用的库的 DLL 函数中。该函数run是线程安全的。
主要执行:
for (const auto & asset : market.assets())
{
for (const auto & scale : market.scales())
{
auto file = market.get(asset, scale, 250);
//std::packaged_task < std::string() > task([asset, scale, file, &module]()
//{
// return boost::python::extract < std::string > (
// module(asset.c_str(), scale.c_str(), file.string().c_str()));
//});
//data[asset][scale] = std::make_pair(std::move(file),
// boost::asio::post(thread_pool, std::move(task)));
std::string message = boost::python::extract < std::string >(
module(asset.c_str(), scale.c_str(), file.string().c_str()));
data[asset][scale] = std::make_pair(std::move(file), std::move(message));
}
}
在当前的串行执行中,一切正常。但是,如果添加thread_pool,将后者包裹在std::string中data,std::future并将主执行中的代码替换为当前注释掉的代码,则会发生错误。它的内容没有说什么具体的,错误是在Boost.Python级别的,如果你跟踪它,那么在设置某种回调函数时读/写指针有问题。
问题:如何配置Boost.Python,让Boost的并行执行机制和标准库可以并行执行一些线程安全的Python函数?
一般的想法是为 python 解释器使用第二个线程。
相关链接::