易截截图软件、单文件、免安装、纯绿色、仅160KB

Boost Python的多线程问题

      因为工作中一个项目需要在运行过程中支持可以随时修改和便于管理的运行流程和配置参数管理,所以决定使用嵌入Python的方式实现,但是项目是多线程的,所以需要确定Boost Python的多线程支持程度,做了一些尝试。
1、Boost Python不支持多线程:
     使用Boost ThreadPool简化多线程环境,尝试如下:
void Pytest1()
{
Py_Initialize();
PyRun_SimpleString("from time import time,ctime\n"
       "print 'Today is',ctime(time())\n");
Py_Finalize();
}
void do_task()
{
for (int i = 0; i < 10; ++i)
{
Pytest1();
}
boost::xtime xt;
boost::xtime_get(&xt, boost::TIME_UTC); // initialize xt with current time
xt.sec += 1; // change xt to next second
boost::thread::sleep(xt); // do sleep
}
void Pytest3()
{
pool tp(5);
Py_Initialize();
// Add some tasks to the pool.
for (int i = 0 ; i <= 5; ++i)
{
tp.schedule(&do_task);
}
// Wait until all tasks are finished.
tp.wait();
Py_Finalize();
}
 
 
程序运行失败,报运行异常信息,看来直接在多线程中使用Boost Python不行。
2、在多线程中采用锁保护,实现Python运行环境的多线程串行化运行:
     尝试如下:
boost::mutex m_io_monitor;
 
void do_task()
{
for (int i = 0; i < 10; ++i)
{
{
boost::mutex::scoped_lock lock(m_io_monitor);
PyRun_SimpleString("from time import time,ctime\nprint 'Today is',ctime(time())\n");
}
boost::xtime xt;
boost::xtime_get(&xt, boost::TIME_UTC); // initialize xt with current time
xt.sec += 1; // change xt to next second
boost::thread::sleep(xt); // do sleep
}
}
void Pytest3()
{
pool tp(5);
Py_Initialize();
// Add some tasks to the pool.
for (int i = 0 ; i <= 5; ++i)
{
tp.schedule(&do_task);
}
// Wait until all tasks are finished.
tp.wait();
Py_Finalize();
}
 
运行完全正常。
 
3、在多线程中采用锁保护,实现Python调用脚本的多线程串行化运行:
boost::mutex m_io_monitor;
void do_task()
{
f


相关文档:

Python字典按value排序

myDict = { 'item1' : [ 7, 1, 9], 'item2' : [8, 2, 3], 'item3' : [ 9, 3, 11 ] }
def sortDic(Dict,valuePostion):
return sorted(Dict.items(),key=lambda e:e[1][valuePostion])
//按value的第3个值排序
sortDic(myDict,2)
[('item2', [8, 2, 3]), ('item1', [7, 1, 9]), ('item3', [9, 3, 11])]
//按value的第 ......

Python中的OS模块

os模块提供了多数操作系统的功能接口函数.当os模块被导入后,它会自适应于不同的操作系统平台,如posix或NT系统平台,os模块会根据不同的平台进行相应的操作.本节内容将对os模块提供的函数进行详细的解读.
1.1 文件操作函数
1.1.1 open()函数提供创建、打开、修改文件的功能。
Example 1-1. Using the os Module to Rename ......

Python内部的线程实现

在Python中的线程运行实际是受到Interpreter的控制或者说牵制的。在Interpreter的核心函数
PyObject * PyEval_EvalFrameEx
(PyFrameObject *f, int
throwflag)
我们可以看到有一个全局变量_Py_Ticker来控制着线程对Interpreter的占有的,默认是Interpreter每执行一百条指令就会释放另一个全局变量interpreter_lock.
......

使用C语言扩展Python(二)

在上一篇中我们已经使用c语言实现了一个最简单的扩展模块,这一篇中将在其基础上进行功能的丰富。首先来考虑如何从外部的Python向C模块传递进参数,foo_bar2展示了如何向C模块传递整数,浮点数,字符串三个参数,其中"ids"指明了传入参数的数据类型。PyArg_ParseTuple负责对args进行解析,若解析失败则返回0.代码#include&n ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号