New in Emacs 26.1: Support concurrency in Emacs Lisp

用 Thread 实现的并行支持已经合并进了 master

https://github.com/emacs-mirror/emacs/commit/2412a1fc05fe9f89b171d0781c2d530923f48adc

News (source):

** Emacs now provides a limited form of concurrency with Lisp threads. Concurrency in Emacs Lisp is “mostly cooperative”, meaning that Emacs will only switch execution between threads at well-defined times: when Emacs waits for input, during blocking operations related to threads (such as mutex locking), or when the current thread explicitly yields. Global variables are shared among all threads, but a ‘let’ binding is thread-local. Each thread also has its own current buffer and its own match data.

See the chapter “Threads” in the ELisp manual for full documentation of these facilities.

3 个赞

哦哦,支持多线程了吗。这样就看gnus就不会卡了吧。有编译成功的吗。

编译应该没问题吧,我的 Emacs 就是昨天编译自最新的 master 分支。

(emacs-version)
     ⇒ "GNU Emacs 26.0.50.11 (x86_64-pc-linux-gnu, GTK+ Version 3.18.9)
 of 2016-12-23"

emacs-repository-version
     ⇒ "a978d300a3faf58ee6e94ba57f764ca99a9ec308"

决定观望GNU Emacs更新。

刚换成25.1。。。。。

emacs开发还挺活跃的吗?现在核心开发几个人呀?

感觉Emacs扩展没有跟上Emacs的步伐啊

有打包的版本吗?

今天编译了一下上面提到支持多线程的emacs版本。编译完运行发现spacemacs会报错。

(emacs-version)
"GNU Emacs 26.0.50.1 (x86_64-apple-darwin16.3.0, NS appkit-1504.76 Version 10.12.2 (Build 16C67))
 of 2017-01-07"
emacs-repository-version
nil

而且发现有个gnutls的问题。而且很卡。试了几下,滚回去继续用25.1。

(emacs-version)
"GNU Emacs 26.0.50.1 (x86_64-apple-darwin13.4.0, NS appkit-1265.21 Version 10.9.5 (Build 13F1911))
 of 2017-01-07"

不知道多线程怎么使用,org-babel-execute-src-block 执行一段代码,在返回之前 Emacs 依然 hangs。

仔细看标題,只是在Elisp中支持多线程。 所以,要对現有package进行修改⋯⋯

大意了。起先也在想是不是要等 pakcage 支持,粗略扫了一眼上边的信息,都是 .c 文件,也没看到 async-call 之类的函数,以为在底层实现了,创建子进程自然都异步了。

如果要等 package 支持,也许不必 26.1,在 25.1 上自行包装一下就可以了:

这是在说并行吧,多线程好像早就支持了。https://github.com/mola-T/timp

1 个赞

这个 Timp 和 async 本质上没区别,都是通过 fork 一个 emacs 进程实现的伪多线程/异步。劣势在于无法共享变量。

Concurrency 其实是并发,和并行(Parallel)也有区别……

能并发就代表有原生多线程支持了。

很期待这个功能