zoukankan      html  css  js  c++  java
  • python学习笔记之---多线程

    #创建线程
    #encoding=utf-8
    from threading import Thread  #引入线程的包
    import time
     
     
    def run(a = None, b = None) :
      print(a, b )
      time.sleep(1)
     
     
    t = Thread(name = "g1",target = run, args = ("g1", "thread"))
    #此时线程是新建状态
     
     
    print(t.getName()) #获得线程对象名称
    print(t.isAlive()) #判断线程是否还活着,在start后,在执行完毕前调用isAlive()才会返回True
    t.start() #启动线程
    t.join()  #主线程等待子线程t执行结束
    print("Done!")
    D:>py -3 a.py
    g1
    False
    g1 thread
    Done!
     
     
    #通过继承Thread类创建线程
    #encoding=utf-8
    import threading  
    import time  
    class timer(threading.Thread):
        #The timer class is derived from the class threading.Thread
        def __init__(self, num, interval):  
            threading.Thread.__init__(self)  
            self.thread_num = num  
            self.interval = interval  
            self.thread_stop = False
     
     
        def run(self):
            #Overwrite run() method, put what you want the thread do here  
            while not self.thread_stop:  
                print('Thread Object(%d), Time:%s
    ' %(self.thread_num, time.ctime())  )
                time.sleep(self.interval)
        def stop(self):  
            self.thread_stop = True  
     
     
    def test():  
        thread1 = timer(1, 1)  
        thread2 = timer(2, 2)  
        thread1.start()  #执行类里面的run方法
        thread2.start()  
        time.sleep(10)  
        thread1.stop()  
        thread2.stop()  #停止线程
     
     
    if __name__ == '__main__':  
        test()
    D:>py -3 a.py
    Thread Object(1), Time:Fri Nov  8 22:35:12 2019
     
    Thread Object(2), Time:Fri Nov  8 22:35:12 2019
     
    Thread Object(1), Time:Fri Nov  8 22:35:13 2019
     
    Thread Object(2), Time:Fri Nov  8 22:35:14 2019
     
    Thread Object(1), Time:Fri Nov  8 22:35:14 2019
     
    Thread Object(1), Time:Fri Nov  8 22:35:15 2019
     
    Thread Object(2), Time:Fri Nov  8 22:35:16 2019
     
    Thread Object(1), Time:Fri Nov  8 22:35:16 2019
     
    Thread Object(1), Time:Fri Nov  8 22:35:17 2019
     
    Thread Object(2), Time:Fri Nov  8 22:35:18 2019
     
    Thread Object(1), Time:Fri Nov  8 22:35:18 2019
     
    Thread Object(1), Time:Fri Nov  8 22:35:19 2019
     
    Thread Object(2), Time:Fri Nov  8 22:35:20 2019
     
    Thread Object(1), Time:Fri Nov  8 22:35:20 2019
     
    Thread Object(1), Time:Fri Nov  8 22:35:21 2019
     
     
    #守护线程
    # encoding: UTF-8
    import threading  
    import time  
    class MyThread(threading.Thread):  
      def __init__(self, id):  
        threading.Thread.__init__(self)  
     
      def run(self):  
        time.sleep(5)  
        print("This is " + self.getName())  
     
    if __name__ == "__main__":  
      t1 = MyThread(999)  
      #t1.setDaemon(True) # 将子线程设置为守护线程
      t1.start()  
      print("I am the father thread.")
    D:>py -3 a.py
    I am the father thread.
    This is Thread-1
     
    #线程池
    #encoding=utf-8
    import time
    from multiprocessing.dummy import Pool as ThreadPool
    #ThreadPool表示给线程池取一个别名ThreadPool
     
    def run(fn):
      time.sleep(2)
      print(fn,end="")
     
    if __name__ == '__main__':
      testFL = [1,2,3,4,5]
      pool = ThreadPool(10)#创建10个容量的线程池并发执行
      pool.map(run, testFL)
      pool.close()
      pool.join()
    D:>py -3 a.py
    54321
     
     
    线程锁
    #encoding=utf-8
    import time
    from multiprocessing.dummy import Pool as ThreadPool
    #ThreadPool表示给线程池取一个别名ThreadPool
     
    def run(fn):
      time.sleep(2)
      print(fn,end="")
     
    if __name__ == '__main__':
      testFL = [1,2,3,4,5]
      pool = ThreadPool(10)#创建10个容量的线程池并发执行
      pool.map(run, testFL)
      pool.close()
      pool.join()
     
     
    #生产者和消费者
    #encoding=utf-8
    import threading
    import time
     
     
    data = 0
    lock = threading.Lock()#创建一个锁对象
     
     
    def func() :
      global data
      print("%s acquire lock...
    " %threading.currentThread().getName())
      if lock.acquire() :
        print("%s get lock...
    " %threading.currentThread().getName())
        data += 1 #must lock
        time.sleep(2)#其它操作
        print("%s release lock...
    " %threading.currentThread().getName())
     
     
        #调用release()将释放锁
        lock.release()
     
     
     
     
    startTime = time.time()
    t1 = threading.Thread(target = func)
    t2 = threading.Thread(target = func)
    t3 = threading.Thread(target = func)
    t1.start()
    t2.start()
    t3.start()
    t1.join()
    t2.join()
    t3.join()
     
     
    endTime = time.time()
    print("used time is", endTime - startTime)
    D:>py -3 a.py
    Thread-1 acquire lock...
     
    Thread-2 acquire lock...
     
    Thread-1 get lock...
    Thread-3 acquire lock...
     
     
    Thread-1 release lock...
     
    Thread-2 get lock...
     
    Thread-2 release lock...
     
    Thread-3 get lock...
     
    Thread-3 release lock...
     
    used time is 6.0552496910095215
     
     
    >>> q.empty()
    True
    >>> q.full()
    False
    >>> q.qsize
    <bound method Queue.qsize of <queue.Queue object at 0x0000000002551470>>
    >>> q.qsize()
    0
    >>> q.get_nowait()
     
     
    #死锁
    #coding=utf-8
    import threading  
    import time
     
     
    lock1 = threading.Lock()  
    lock2 = threading.Lock()  
    print(lock1, lock2)
    class T1(threading.Thread):  
        def __init__(self, name):  
            threading.Thread.__init__(self)  
            self.t_name = name  
     
     
        def run(self):  
            lock1.acquire()  
            time.sleep(1)#睡眠的目的是让线程2获得调度,得到第二把锁
            print('in thread T1',self.t_name)
            time.sleep(2)
            lock2.acquire() #线程1请求第二把锁
            print('in lock l2 of T1')  
            lock2.release()      
            lock1.release()
     
     
    class T2(threading.Thread):  
        def __init__(self, name):  
            threading.Thread.__init__(self)  
            self.t_name = name  
     
     
        def run(self):  
            lock2.acquire()  
            time.sleep(2)#睡眠的目的是让线程1获得调度,得到第一把锁
            print('in thread T2',self.t_name)
            lock1.acquire() #线程2请求第一把锁
            print('in lock l1 of T2')
            lock1.release()
            lock2.release()
     
     
    def test():  
        thread1 = T1('A')  
        thread2 = T2('B')  
        thread1.start()  
        thread2.start()  
     
     
    if __name__== '__main__':  
        test()
    D:>py -3 a.py
    <unlocked _thread.lock object at 0x0000023760EA8B98> <unlocked _thread.lock object at 0x0000023760EA8C38>
    in thread T1 A
    in thread T2 B
    t2:拿到了lock2锁,等lock1锁
     
    t1:拿到了lock1锁,等lock2锁
     
     
     
     
     

    协程
    协程:一个线程里的多个任务
    #yield实现协程
    import time
     
    def consumer(name):    #生成器
        print("%s 要开始吃包子了!"%(name))
        while True:
            baozi=yield    #暂停,记录位置,返回跳出(接收下面send发送的数据,接收到数据后才会继续执行)
            print("包子%s,%s吃了"%(baozi,name))
     
     
    def producer(name):
        c=consumer("消费者")    #只是变成一个生成器
        c.__next__()       #next只唤醒yield不传递值
        for i in range(4): #暂停
            time.sleep(1)
            print("%s 做了包子%s"%(name,i))
            c.send(i)      #发送数据
     
    if __name__=="__main__":
        producer("生产者")
     
     
     
    from greenlet import greenlet
     
    def proc1():  #任务1
        print(12)
        gr2.switch()
        print(34)
        gr2.switch()
     
    def proc2(): #任务2
        print(56)
        gr1.switch() #切换
        print(78)
     
    if __name__=="__main__":
        gr1=greenlet(proc1)  #启动一个协程
        gr2=greenlet(proc2)
        gr1.switch()  #先执行gr1指定运行的函数,然后在切换到gr2
  • 相关阅读:
    box-shadow中的理解(bootstrap)
    setTimeout用于取消多次执行mouseover或者mouseenter事件,间接实现hover的悬停加载的效果.
    把之前能运行的springboot项目重新打开运行,报错 Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured.
    angularjs服务json文件实现省市区三级联动
    js页面用户信息填写表单
    js页面中实现加载更多功能
    遇见未知的自己
    ASP.NET Core 入门教程1 ASP.NET Core 读取配置文件
    有一种选择叫女程(5)
    有一种选择叫女程(4)
  • 原文地址:https://www.cnblogs.com/wenm1128/p/11837305.html
Copyright © 2011-2022 走看看