关于通过 vim 的 python 接口使用多线程特性的问题 - Jacky Liu's Blog

关于通过 vim 的 python 接口使用多线程特性的问题

Jacky Liu posted @ 2011年4月26日 10:16 in Vim with tags python vim gvim 线程 多线程 thread GUI , 3040 阅读

    ---- Vim Bug 第三弹,以下代码:

python3 << EOF

import threading
import time

print('xxx')

def print_to_vim():
	print('yyy')

threading.Thread(name='test', target=print_to_vim).start()

print('xxx')

time.sleep(3)

EOF

    ---- source 以后 gvim 窗口神奇蒸发,得到如下结果:

    ---- 结论: 通过 python 接口开了多个线程的话,只容许其中一个线程使用 print() 函数。不过这看起来像是 Gnome 或者 X 的问题,不是 Vim 的问题。
   
    ---- 我就是想拿 Vim 当我自编程序的用户界面而已,这至于吗。

    ---- 设计目标:

    1. 从 Vim 窗口里通过自定义命令和按键控制外部程序,不需要进 Shell。
    2. 程序输出通过 Vim 窗口来显示。利用 Python 的多线程特性,主线程处理日常功能,辅助线程专门监听程序的输出,一有输出就刷新 buffer 显示。

    ---- 以上。再配合用新写的 FSE 模块来浏览和管理程序文件,别的什么都不需要了。

    ---- 要是一切如常的话,搞定这些是完全没有问题的,就是怕这些层出不穷的 bug。我容易吗我。

 

Avatar_small
依云 说:
2011年4月26日 19:09

我曾经在 Vim 里使用 Python 的线程就悲剧过。。

Avatar_small
蓝色基因 说:
2011年4月27日 01:36

@依云: 看样子还有地雷啊 。。。 我会不会踩到呢 :-)

Avatar_small
依云 说:
2011年4月27日 11:01

@蓝色基因: 我觉得之所以不能用线程是因为 clone 之后,两个进程都以同一身份向 X server 通讯,所以就挂掉了。Vim 里边一直没有多线程的办法的。不过也许你可以试试 Lua 的 coroutine?

Avatar_small
蓝色基因 说:
2011年4月27日 12:12

@依云: 这个问题基本已经锁定到 GUI 系统上了,因为用 vim 是没问题的,就 gvim 有问题。不光不能用 print(),实际上不能造成 gvim 窗口里的显示有任何改变,只能修改后台数据。在网上搜了出错信息,遇上这问题的还不少,起因千奇百怪,但都指向图形显示系统。你看这:
http://ubuntuforums.org/showthread.php?t=1301185&page=3
所以我很有把握地推测,这是个 GUI 里隐藏很深的一个系统级 bug(恩,定是如此,nod nod 。。。)
另外,意外发现写的那些插件在 vim 下也能用,可是没有颜色我怎么用啊!想把电脑摔了。。。我的插件必须要改了,后台即时刷新的效果是不可能了,一场空唉 。。。

Avatar_small
依云 说:
2011年4月27日 13:09

@蓝色基因: 这个是 X window 的机制造成的吧?

原来在终端下可以多线程啊。那你就在终端下用呗,颜色的话终端下有 256 色,够了吧?

Avatar_small
依云 说:
2011年4月27日 13:23

@蓝色基因: 我在终端里测试了下,刷新效果还是得用户做了某个操作后才会出现的,并不能做到实时。

你考虑下重构 Vim 吧?弄个 Vimm (Vim iMproved) 出来。

Avatar_small
蓝色基因 说:
2011年4月27日 13:36

@依云: Nope。不搞了,就搞个简单的自定义命令就可以了。问题是如果用 subprocess 开启了自己写的外部程序,那 Vim 一退出,子进程也就被强制关闭了。我在想有没有什么办法让它不要这样。

Avatar_small
依云 说:
2011年4月27日 15:43

@蓝色基因: 这个是 Linux 编程基础操作啊。忽略 HUP 信号、setsid、fork 两次等等。

Avatar_small
蓝色基因 说:
2011年4月27日 15:57

@依云: 是 。。。问题是我的外部程序也是 python 写的,有办法么?

Avatar_small
蓝色基因 说:
2011年4月27日 16:04

@依云: 嗯。或许用 os 模块和 signal 模块可以。启发了,感谢感谢。

Avatar_small
依云 说:
2011年4月27日 16:18

@蓝色基因: 别以为 Python 是 Java,难以搞点系统相关的操作。

Avatar_small
蓝色基因 说:
2011年4月27日 16:34

@依云: 然 :-) Java 是故意要把系统隔离开的,Python 没有。


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter
Host by is-Programmer.com | Power by Chito 1.3.3 beta | © 2007 LinuxGem | Design by Matthew "Agent Spork" McGee