aardio 文档
aardio 范例: Python 3 - 多线程 GIL
//多线程 GIL
import win.ui;
/*DSG{{*/
var winform = win.form(text="Python 3 - 多线程 GIL";right=1163;bottom=753)
winform.add(
button={cls="button";text="点这里试试";left=876;top=663;right=1102;bottom=723;z=2};
edit={cls="edit";left=11;top=16;right=1140;bottom=625;edge=1;multiline=1;z=1}
)
/*}}*/
/*
Python 多线程有很多限制,用起来也复杂,一般不建议用。
这是 Python 的限制与 aardio 无关!不信可以换个编程语言试试。
要解决 Python 这个限制很容易,Python 开源的,请放开手干!!!
要点1、一定要在主线程导入 Python 库
主线程会负责创建 Python 虚拟机,主线程退出不能再在任何线程调用 Python.
*/
import py3;//不同线程导入不同版本的 Python 会崩溃
/*
要点2、一定要在主线程释放GIL,之后任何python调用都在在py.lock里执行
注意,只有你确实要在多个线程并发调用python时,才需要使用GIL。
*/
py3.releaseThread();
pyThread = function(winform){
import py3;
/*
要点3、启用 GIL 以后,任何 Python 调用都必须在 py.lock 里执行
Python 并不支持真正的多线程,所有调用都要加锁互斥运行。
*/
py3.lock(
function(){
var hashlib = py3.import("hashlib");
var md5 = hashlib.md5()
md5.update( raw.buffer("注意这个函数的参数不是字符串而是字节数组(相当于aardio中的buffer)") );
winform.edit.print(thread.getId(), tostring(md5.hexdigest()) );
}
)
}
winform.button.oncommand = function(id,event){
for(i=1;10;1){
thread.invoke( pyThread,winform )
}
}
winform.show()
win.loopMessage();
Markdown 格式