memo

2011-01-11

gevent.monkey.patch_all() と subprocess.Popen と threading で ^C がきかなくなる

以下のようなコードを実行し ^C で止めようとすると、 CPU を 100% 食い始め、固まる。

from gevent import monkey; monkey.patch_all()

import threading
import time

from subprocess import Popen, PIPE


def worker():
    p = Popen(['vmstat', '3'], stdout=PIPE)
    while p.poll() is None:
        line = p.stdout.readline()
        print line.strip()


try:
    t = threading.Thread(target=worker)
    t.start()

    while True:
        time.sleep(60)

except KeyboardInterrupt:
    print 'interrupted'

一行目を from gevent import monkey; monkey.patch_all(os=False) にするとちゃんと終了してくれるようになる。

何でかは知らんけどね。