python 3コアプログラミングスレッド

3242 ワード

文書ディレクトリ
  • API
  • コールバック方式作成スレッド
  • 継承方式作成スレッド
  • 反発ロック
  • 生産者と消費者モデル
  • ThreadLocal

  • API
    スレッドを開始するstart()
    スレッドの作成Thread(target)
    継承の作成
    class MyThread(threading.Thread): def run(self)
    ロックmutex=threadingを作成する.Lock()
    mutexをロックします.acquire([blocking])
    放出するrelease()
    スレッドローカル変数threading.local()
    コールバック方式によるスレッドの作成
    #coding=utf-8
    import threading
    from time import sleep,ctime
    
    def sing():
        for i in range(3):
            print("    ...%d"%i)
            sleep(1)
    
    def dance():
        for i in range(3):
            print("    ...%d"%i)
            sleep(1)
    
    if __name__ == '__main__':
        print('---  ---:%s'%ctime())
    
        t1 = threading.Thread(target=sing)
        t2 = threading.Thread(target=dance)
    
        t1.start()
        t2.start()
    
        while True:
            length = len(threading.enumerate())
            print('         :%d'%length)
            if length<=1:
                break
    
            sleep(0.5)
    

    継承によるスレッドの作成
    #coding=utf-8
    import threading
    import time
    
    class MyThread(threading.Thread):
        def run(self):
            for i in range(3):
                time.sleep(1)
                msg = "I'm "+self.name+' @ '+str(i) #name              
                print(msg)
    
    
    if __name__ == '__main__':
        t = MyThread()
        t.start()
    

    反発ロック
    #   
    mutex = threading.Lock()
    #  
    mutex.acquire([blocking])
    #  
    mutex.release()
    

    生産者と消費者モデル
    #encoding=utf-8
    import threading
    import time
    
    #python3 
    # from queue import Queue
    
    class Producer(threading.Thread):
        def run(self):
            global queue
            count = 0
            while True:
                if queue.qsize() < 1000:
                    for i in range(100):
                        count = count +1
                        msg = '    '+str(count)
                        queue.put(msg)
                        print(msg)
                time.sleep(0.5)
    
    class Consumer(threading.Thread):
        def run(self):
            global queue
            while True:
                if queue.qsize() > 100:
                    for i in range(3):
                        msg = self.name + '    '+queue.get()
                        print(msg)
                time.sleep(1)
    
    
    if __name__ == '__main__':
        queue = Queue()
    
        for i in range(500):
            queue.put('    '+str(i))
        for i in range(2):
            p = Producer()
            p.start()
        for i in range(5):
            c = Consumer()
            c.start()
    

    ThreadLocal
    ThreadLocalのインスタンスは、スレッドのローカル変数を表し、各スレッドには独自の値しか表示されず、他のスレッドにも存在することを意識しません.
    import threading
    
    #     ThreadLocal  :
    local_school = threading.local()
    
    def process_student():
        #          student:
        std = local_school.student
        print('Hello, %s (in %s)' % (std, threading.current_thread().name))
    
    def process_thread(name):
        #   ThreadLocal student:
        local_school.student = name
        process_student()
    
    t1 = threading.Thread(target= process_thread, args=('dongGe',), name='Thread-A')
    t2 = threading.Thread(target= process_thread, args=('  ',), name='Thread-B')
    t1.start()
    t2.start()
    t1.join()
    t2.join()