1

我是 python 新手,尝试理解 python 中多线程的概念。根据我在 Unix 多线程编程方面的知识,如果 main 函数正在终止,则由 main 函数创建的线程也将终止,而不管它们在线程中所做的工作(如果我们不使用任何 pthread_join() 函数)。

但是在通过 python 中的多线程时,我没有看到这个功能。即使我的主线程完成了它的工作,我的线程仍在成功运行。所以我想知道,Python 和 Unix 中的线程表现不同......或者我错过了一些东西。请帮助理解python中的这个线程功能。这是我在 python 中使用的代码。

#! /usr/bin/python
import logging
import random
import threading
import time

logging.basicConfig(level=logging.DEBUG,
                format='(%(threadName)-10s) %(message)s',
               )

class Counter(object):

def __init__(self, start=0):
    self.lock = threading.Lock()
    self.value = start

def increment(self):
    logging.debug('Waiting for lock')

    # Getting the Lock
    self.lock.acquire()
    try:
        logging.debug('Acquired lock')
        self.value = self.value + 1
    finally:
       # Releasing the Lock 
        self.lock.release()



def worker(c):
    for i in range(2):
        pause = 4 
        logging.debug('Sleeping for %0.02f', pause)
        time.sleep(pause)
        c.increment()
    logging.debug('Done')



if  __name__ == '__main__':
    counter = Counter()
    for i in range(2):
        t = threading.Thread(target=worker, args=(counter,))
        t.start()

    logging.debug('Counter: %d', counter.value)
4

3 回答 3

1

您必须使线程守护进程线程

for i in range(2):
    t = threading.Thread(target=worker, args=(counter,))
    t.setDaemon(True)
    t.start()
于 2012-06-12T11:52:27.253 回答
1

检查文档中有关 Thread.daemon 的内容。“当没有活着的非守护线程时,整个 Python 程序退出。”

于 2012-06-12T11:52:52.760 回答
0

不幸的是,python 中的线程与 linux 线程有点不同。此外,据我所知,根据 GIL http://wiki.python.org/moin/GlobalInterpreterLock只有一个线程同时运行(!)

另外......当 mainThread 终止时,它将等待线程完成,除非它们被创建为setDaemon(True)无论如何你应该自己停止你的线程,例如通过try{main thread code} finally:doSomethingToStopThreads()

于 2012-06-12T11:55:08.733 回答