博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python多线程
阅读量:4623 次
发布时间:2019-06-09

本文共 2081 字,大约阅读时间需要 6 分钟。

实例一:

#coding=utf-8#导入threading模块,在thread上有优化import threadingfrom time import ctimeimport timecount = 0def 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-8import threading, timeclass 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()

 

转载于:https://www.cnblogs.com/BigFishFly/p/6337191.html

你可能感兴趣的文章
OpenCV特征点检测——ORB特征
查看>>
mysql的csv数据导入与导出
查看>>
leetcode笔记:Pascal's Triangle
查看>>
ASP.NET性能优化之构建自定义文件缓存
查看>>
Shell——windows上写完放入linux的时候需要注意的问题
查看>>
65条常用的正则表达式
查看>>
Vscode断点调试PHP
查看>>
做前端要做的6大事
查看>>
LeetCode 813. Largest Sum of Averages
查看>>
vSphere、Hyper-V与XenServer 你选哪个?
查看>>
java.lang.UnsupportedClassVersionError
查看>>
实现接口必须要加注解@Override吗
查看>>
apicloud UISearchBar 使用方法
查看>>
【spring+websocket的使用】
查看>>
mongo二维数组操作
查看>>
localStorage之本地储存
查看>>
Archlinux 交换左Ctrl和Cap键
查看>>
#openstack故障处理汇总
查看>>
搜索旋转排序数组 II
查看>>
20、docker swarm
查看>>