使用htop监视线程化Python程序

时间:2016-02-01 02:33:27

标签: python multithreading

首先,这是我所指的代码:

from random import randint
import time
from threading import Thread
import Queue

class TestClass(object):
    def __init__(self, queue):
        self.queue = queue

    def do(self):
        while True:
            wait = randint(1, 10)
            time.sleep(1.0/wait)
            print '[>] Enqueuing from TestClass.do...', wait
            self.queue.put(wait)


class Handler(Thread):
    def __init__(self, queue):
        Thread.__init__(self)
        self.queue = queue

    def run(self):
        task_no = 0
        while True:
            task = self.queue.get()
            task_no += 1
            print ('[<] Dequeuing from Handler.run...', task,
                                            'task_no=', task_no)
            time.sleep(1) # emulate processing time
            print ('[*] Task %d done!') % task_no
            self.queue.task_done()

def main():
    q = Queue.Queue()
    watchdog = TestClass(q)
    observer = Thread(target=watchdog.do)
    observer.setDaemon(True)

    handler = Handler(q)
    handler.setDaemon(True)

    handler.start()
    observer.start()

    try:
        while True:
            wait = randint(1, 10)
            time.sleep(1.0/wait)
            print '[>] Enqueuing from main...', wait
            q.put(wait)
    except KeyboardInterrupt:
        print '[*] Exiting...', True

if __name__ == '__main__':
    main()

虽然代码对我的问题不是很重要,但它是一个简单的脚本,在主要代码之上生成2个线程。其中两个将“任务”排入队列,一个队列出局并“执行”它们。

我刚刚开始在python中学习线程,我当然遇到了GIL的主题,所以我希望有一个进程。但问题是,当我用htop监视这个特定的脚本时,我注意到不是1,而是产生了3个进程。

这怎么可能?

1 个答案:

答案 0 :(得分:1)

GIL意味着一次只有一个线程“可以正常工作”,但这并不意味着Python不会产生线程。在您的情况下,您要求Python生成两个线程,因此它(总共提供三个线程)。仅供参考,top会列出进程和线程,以免引起您的混淆。

Python线程在您需要并发但不需要并行性时非常有用。并发是一种使程序更简单,更模块化的工具;它允许你为每个任务生成一个线程,而不必编写一个大的(通常是凌乱的)while循环和/或使用一堆回调(如JavaScript)。

如果您对此主题感兴趣,我建议使用Google搜索“并发与并行”。这个概念不是语言特定的。

编辑:另外,你可以阅读this Stack Overflow线程。