线程使用

来源:互联网 发布:pe pvdc 知乎 保鲜膜 编辑:程序博客网 时间:2024/05/20 05:07

建议不要用thread模块,而应该使用threading和Queue模块等

threading模块                 确保所有“重要的”子线程都退出后,进程才会结束

threading模块支持守护线程,如果你的主线程要退出的时候,不用等待那些子线程完成,那就设定这些线程的daemon属性,即在线程开始之前,调用setDaemon()函数设定线程的daemon标志,表示这个线程“不重要”

#!/usr/bin/env pythonimport threadingfrom time import ctimeclass myThread(threading.Thread):  def __init__(self, func, args, name = ''):    threading.Thread.__init__(self)    self.name = name    self.func = func    self.args = args  def getResult(self):    return self.res  def run(self):    print 'starting', self.name, 'at: ', ctime()    self.res = self.func(*self.args)    print 'self.name', 'finished at: ', ctime()

#!/usr/bin/env pythonfrom myThread import myThreadfrom time import ctime, sleepdef fib(x):  sleep(0.005)  if x < 2:    return 1  return (fib(x-2) + fib(x-1))def fac(x):  sleep(0.1)  if x < 2: return 1  return (x * fac(x-1))def sum(x):  sleep(0.1)  if x < 2: return 1  return (x + sum(x-1))funcs = [fib, fac, sum]n = 12def main():  nfuncs = range(len(funcs))  print '*** SINGLE THREAD'  for i in nfuncs:    print 'starting', funcs[i].__name__, 'at: ', ctime()    print funcs[i](n)    print funcs[i].__name__, 'finished at: ', ctime()  print '/n*** MULTIPLE THREADS'  threads = []  for i in nfuncs:    t = MyThread(funcs[i], (n, ), funcs[i].__name__)    threads.append(t)  for i in nfuncs:    threads[i].start()  for i in nfuncs:    threads[i].join()    print threads[i].getResult()  print 'all DONE'if __name__ == '__main__':  main()

#!/usr/bin/env pythonfrom random import randintfrom time import sleepfrom Queue import Queuefrom myThread import MyThreaddef writeQ(queue):  print 'producing object for Q...'  queue.put('xxx', 1)  print 'size now', queue.qsize()def readQ(queue):  val = queue.get(1)  print 'consumed object from Q... size now', queue.qsize()def writer(queue, loops):  for i in range(loops):    writeQ(queue)    sleep(randint(1, 3))def reader(queue, loops):  for i in range(loops):    readQ(queue)    sleep(randint(2, 5))funcs = [writer, reader]nfuncs = range(len(funcs))def main():  nloops = randint(2, 5)  q = Queue(32)  threads = []  for i in nfuncs:    t = MyThread(funcs[i], (q, nloops), funcs[i].__name__)    threads.append(t)  for i in nfuncs:    threads[i].start()  for i in nfuncs:    threads[i].join()   print 'all DONE'if __name__ == '__main__':  main()