在日常的工作和生活中,咱接触到 aardio 的更新内容,发现这次更新还挺有意思的。最近参加技术研讨会时,发现行业内对人工智能应用很关注,没想到在 aardio 里也能看到一些和编程相关的更新呢。
在多线程方面,更新内容对线程对象传递规则做了更细致的说明。以前对于哪些对象能跨线程传递可能有点模糊,现在清晰多啦。
更新前,对于能传入其他线程使用的对象描述相对简单,像只提到没有任何外部依赖的数值、字符串、buffer、table、function 可以传入其他线程使用,且是传值而非传址。对于不能传入的对象也只是简单提及「类」和「类」创建的实例对象一般不可以传入。而更新后,对不能跨线程传递的对象做了更详细分类:
- COM 对象不可以从一个线程传递到另一个线程。
- 存在外部依赖(例如闭包或元表)的对象通常不能跨线程传递(除非文档明确说明该对象支持跨线程传递)。使用类构造的实例对象通常不能跨线程传递,因为类实例的方法可能不是纯函数,并且类实例可能指定了元表(通常用于指定属性元表、重载操作符、或实现原型继承)。
同时,对可以跨线程传递的对象也做了详细分类:
- 纯值对象可以跨线程传递:没有外部依赖的数值、布尔值、字符串、buffer、table 对象、纯数组、结构体、time 或 time.ole 对象、function(必须是纯函数)可以从一个线程传到另一个线程使用,这些对象跨线程传递都是传值而非传址。
- 支持跨线程访问共享资源的对象:thread.var、thread.table、thread.command、thread.event、thread.semaphore、process.mutex、fsys.file、fsys.stream、fsys.mmap、raw.struct 等对象可以跨线程传递并自动绑定相同的共享资源(线程共享变量、系统句柄或内存地址)。
- 窗口对象(win.form 窗体与控件对象):win.form 构造的窗体以及窗体上的所有控件都可以跨线程传递,这些窗口对象在传入其他线程时会自动复制一个代理对象,跨线程调用窗口代理对象的方法或属性时会转发调用到窗口所在的界面线程执行,并且等待调用完成然后获取返回值。
- 其他支持窗口消息转发调用的界面线程对象:一些属于界面线程的对象通过将
_serialize
元方法指定为 thread._callableSerialize
就可以像 win.form 对象一样在传入其他线程时复制一个代理对象,多线程调用 web.view 代理对象的属性或方法也会转发调用到窗口所在的界面线程执行。
另外,在代码示例方面也有更新。比如消息框函数示例,增加了详细的代码:
import win.ui;
/*DSG{{*/
var winform = win.form(text="消息框")
/*}}*/
winform.msgbox("消息","可选标题");
winform.msgbox("警告消息","可选标题","warn");
if( 6/*_IDYES*/ == winform.msgbox("显示「是」、「否」与「取消」按钮","可选标题","question") ){
}
winform.msgboxErr("错误消息","可选标题");
if( winform.msgboxTest("显示「确定」与「取消」按钮","可选标题") ){
}
winform.show();
win.loopMessage();
在 HTTP 客户端代码中,也对注释做了优化,比如将“每个线程都有独立的变量环境,线程使用的库必须单独导入”改为“每个线程都有独立的变量环境,线程内使用的库必须在线程内导入”。
在 lib/web/rest/aiChat/_.aardio
文件中,代码也有修改,增加了 stream_options
相关内容,还对非 SSE 响应的处理做了优化,增加了错误数据的记录等。
总之,这次更新让 aardio 在多线程使用和代码示例方面更加完善啦👏。
个人学习笔记,大家不要与官方混淆