zoukankan      html  css  js  c++  java
  • 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()
  • 相关阅读:
    Python面向对象详解
    使用树莓派搭建LoRaWAN网关并接入腾讯云物联网开发平台
    dajngo
    dajngo 项目目录结构调整
    Django
    nacos的简单使用
    MySQL数据库开发规范
    mabatis的sql标签
    直接插入100w数据报错
    大数据量插入到数据库
  • 原文地址:https://www.cnblogs.com/BigFishFly/p/6337191.html
Copyright © 2011-2022 走看看