Python多线程同步,,对Python多线程


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

1. 锁机制

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

在此没有给出样例后面条件

2.条件Contidion

代码段:

classReader(threading.Thread):

def__init__(self,condition,data):

threading.Thread.__init__(self)

self.condition=condition

self.data=data

pass

defrun(self):

whileTrue:

withself.condition:

print("waiting...")

self.condition.wait()

msg=self.data.pop()

if"exit"==str(msg).lower():

print("exit")

break

print("readdate:{}".format(msg))

deftest_condition():

condition=threading.Condition()

dl=[]

reader=Reader(condition,dl)

reader.daemon=True

reader.start()

whileTrue:

withcondition:

msg=input("输入:")

dl.append(msg)

print("notify...")

condition.notifyAll()

if"exit"==msg.lower():

break

time.sleep(0.012)

2.事件Event

代码段:

classReader2(threading.Thread):def__init__(self,event,data):threading.Thread.__init__(self)self.event=eventself.data=datapass
defrun(self):whileTrue:print("waiting...")self.event.wait()msg=self.data.pop()if"exit"==str(msg).lower():print("exit")breakprint("readdate:{}".format(msg))
deftest_event():event=threading.Event()dl=[]
reader2=Reader2(event,dl)reader2.daemon=Truereader2.start()
whileTrue:msg=input("输入:")dl.append(msg)print("notify...")event.set()event.clear()
if"exit"==msg.lower():breaktime.sleep(0.012)pass

2.队列Queue

代码段:

classReader3(threading.Thread):def__init__(self,queue):threading.Thread.__init__(self)self.queue=queuedefrun(self):whileTrue:print("waiting...")msg=self.queue.get()print("readdata:{}".format(msg))if"exit"==msg.lower():breakself.queue.task_done()pass
deftest_queue():q=queue.Queue()
reader3=Reader3(q)reader3.daemon=Truereader3.start()
whileTrue:msg=input("输入:")q.put(msg)print("notify...")time.sleep(0.01)if"exit"==msg.lower():breakpass

参考文档:https://zhuanlan.zhihu.com/p/27963810

Python多线程同步

评论关闭