python多线程

实例一:

#coding=utf-8
#导入threading模块,在thread上有优化
import threading
from time import ctime
import time
count = 0
def test(func):
    global count
    time.sleep(1)#测试锁
    if lock.acquire(1):
        count += 1
        print "thread: %s. %s" %(func,ctime())
        print 'num:%s.%s'%(count,ctime())
        lock.release()
    ##or
    # with lock:
    #     count += 1
    #     print "thread: %s. %s" %(func,ctime())
    #     print 'num:%s.%s'%(count,ctime())
if __name__ == '__main__':
    lock = threading.Lock()
    #创建threads数组
    threads = []
    #创建10个线程
    for i in range(10):
        t = threading.Thread(target=test,args=(i,))
        t.setDaemon(True)
        #开启线程
        t.start()
        threads.append(t)
    for i in threads:i.join()
    print "all over %s" %ctime()

创建线程,使用threading.Thread()方法,调用方法target=test,args方法对test传参。创建好的线程装载到threads数组中。

线程对象有两个用来管理线程机制的方法: setDaemon 和 join

主线程启动若干个子线程后,如果需要等待所有的子线程执行完毕后继续执行主线程,这里需要用到的就是 join 方法,如果没有为子线程注册 join,则可能会出现在主线程执行完毕之前,还有很多子线程没有执行完毕,这时如果你为子线程注册了 setDaemon(True) 的话,主线程会回收此子线程;否则,主线程自己结束,子线程依旧在那执行。默认是 False,也就说主线程不会回收子线程。

 setDaemon() : 设置此线程是否被主线程守护回收。默认False不回收,需要在 start 方法前调用;设为True相当于像主线程中注册守护,主线程结束时会将其一并回收。

 join(): 设置主线程是否同步阻塞自己来待此线程执行完毕。如果不设置的话则主进程会继续执行自己的,在结束时根据 setDaemon 有无注册为守护模式的子进程,有的话将其回收,没有的话就结束自己,某些子线程可以仍在执行。

实例二:

# coding : uft-8
import threading, time
class MyThread(threading.Thread):#使用类定义thread,继承threading.Thread
    def __init__(self):
        threading.Thread.__init__(self)
    def run(self):#run函数必须实现
        global n, lock #多线程是共享资源的,使用全局变量
        time.sleep(1)
        if lock.acquire():#当需要独占n资源时,必须先锁定,这个锁可以是任意的一个锁,可以使用上边定义的3个锁中的任意一个
            print n , self.name
            n += 1
            lock.release()#使用完counter资源必须要将这个锁打开,让其他线程使用
if "__main__" == __name__:
    n = 1
    ThreadList = []
    lock = threading.Lock()#只是定义一个锁,并不是给资源加锁,你可以定义多个锁,像下两行代码,当你需要占用这个资源时,任何一个锁都可以锁这个资源
    lock1 = threading.Lock()
    for i in range(1, 200):
        t = MyThread()
        ThreadList.append(t)
    for t in ThreadList:
        t.start()
    for t in ThreadList:
        t.join()

 

posted @ 2017-01-21 15:58  知行Lee  阅读(262)  评论(0编辑  收藏  举报