zoukankan      html  css  js  c++  java
  • Python多线程同步

    对Python多线程实现同步机制及其遇到的一些问题。本文给出了样例代码 ,主要包括Condition,Event and Queue三种机制

    1. 锁机制

    threading的Lock类,用该类的acquire函数进行加锁,用realease函数进行解锁,当一个线程调用锁的acquire()方法获得锁时,锁就进入“locked”状态。每次只有一个线程可以获得锁。如果此时另一个线程试图获得这个锁,该线程就会变为“blocked”状态,称为“同步阻塞”

    在此没有给出样例

    2.条件 Contidion

    代码段:

    class Reader(threading.Thread):
        def __init__(selfconditiondata):
            threading.Thread.__init__(self)
            self.condition = condition
            self.data = data
            pass

        def run(self):
            while True:
                with self.condition:
                    print("waiting...")
                    self.condition.wait()
                    msg = self.data.pop()
                    if "exit" == str(msg).lower():
                        print ("exit")
                        break
                    print("read date:{}".format(msg))

    def test_condition():
        condition = threading.Condition()
        dl=[]

        reader = Reader(condition, dl)
        reader.daemon = True
        reader.start()

        while True:
            with condition:
                msg = input("输入:")
                dl.append(msg)
                print("notify...")
                condition.notifyAll()
                if "exit" == msg.lower():
                    break
            time.sleep(0.01)

    3.事件 Event

    代码段:

    class Reader2(threading.Thread):
        def __init__(selfeventdata):
            threading.Thread.__init__(self)
            self.event = event 
            self.data = data
            pass

        def run(self):
            while True:
                print("waiting...")
                self.event.wait()
                msg = self.data.pop()
                if "exit" == str(msg).lower():
                    print ("exit")
                    break
                print("read date:{}".format(msg))

    def test_event():
        event = threading.Event()
        dl=[]

        reader2 = Reader2(event, dl)
        reader2.daemon = True
        reader2.start()

        while True:
            msg = input("输入:")
            dl.append(msg)
            print("notify...")
            event.set()
            event.clear()

            if "exit" == msg.lower():
                break
            time.sleep(0.012)
        pass

    4.队列 Queue

    代码段:

    class Reader3(threading.Thread):
        def __init__(selfqueue):
            threading.Thread.__init__(self)
            self.queue = queue
        
        def run(self):
            while True:
                print("waiting...")
                msg = self.queue.get()
                print("read data: {}".format(msg))
                if "exit" == msg.lower():
                    break
                self.queue.task_done()
            pass

    def test_queue():
        q = queue.Queue()

        reader3 = Reader3(q)
        reader3.daemon = True
        reader3.start()

        while True:
            msg = input("输入:")
            q.put(msg)
            print("notify...")
            time.sleep(0.01)
            if "exit" == msg.lower():
                break
        pass
  • 相关阅读:
    图算法之广度优先遍历
    图形算法之深度优先遍历
    list下SORT排序方法使用
    Linux使用curl进行接口测试
    Template方法应用
    profile[计算方法耗时模块]用法
    性能测试的实施及总结(二)
    yum源配置
    Dockerfile文件
    Docker的Image与Container
  • 原文地址:https://www.cnblogs.com/bongem/p/11804123.html
Copyright © 2011-2022 走看看