1.python Display the properties and methods of the current thread information in
2. Add a thread
3. In thread join function
4. Use Queue Store the results of the thread
5. Thread lock lock
Preface :
Multithreading is simply understood as : One CPU, That is, single core , Cut time into pieces ,CPU Take turns to deal with one thing , The next thing will be dealt with in the specified time .
1.python Display the properties and methods of the current thread information in# coding:utf-8# Import threading package import threadingif __name__ == "__main__": print(" Number of currently active threads ", threading.active_count()) print(" Display the specific information of all current threads ", threading.enumerate()) print(" The information of the current thread is displayed ", threading.current_thread())
design sketch :
2. Add a thread# coding:utf-8import threadingimport timedef job1(): # Let this thread execute for a few more seconds time.sleep(5) print("the number of T1 is %s" % threading.current_thread())if __name__ == "__main__": # Create a new thread new_thread = threading.Thread(target=job1, name="T1") # Start a new thread new_thread.start() print(" The current number of threads is ", threading.active_count()) print(" Details of all threads ", threading.enumerate()) print(" Current thread details ", threading.current_thread())
design sketch :
3. In thread join function(1) As expected , After executing thread 1, Then the output All done…“ The ideal is full , The reality is not like this ”
# coding:utf-8import threadingimport timedef job1(): print("T1 start") for i in range(5): time.sleep(1) print(i) print("T1 finish")def main(): # Create a new thread new_thread = threading.Thread(target=job1, name="T1") # Start a new thread new_thread.start() print("All done...")if __name__ == "__main__": main()
design sketch :
(2) In order to meet our expectations , We use join function , take T1 Thread blocking .join Function to block ? Which thread is used join function , When this thread is executing , The thread program after him cannot execute , After all the blocked threads are executed , Can perform !
# coding:utf-8import threadingimport timedef job1(): print("T1 start") for i in range(5): time.sleep(1) print(i) print("T1 finish")def main(): # Create a new thread new_thread = threading.Thread(target=job1, name="T1") # Start a new thread new_thread.start() # Block this T1 Threads new_thread.join() print("All done...")if __name__ == "__main__": main()
design sketch :
4. Use Queue Store the results of the threadThread execution result , Unable to get return Go back , Use Queue Storage .
# coding:utf-8import threadingfrom queue import Queue""" Queue Use """def job(l, q): for i in range(len(l)): l[i] = l[i] ** 2 q.put(l)def multithreading(): # Create a queue q = Queue() # The thread list threads = [] # 2 d list data = [[1, 2, 3], [4, 5, 6], [7, 8, 9], [6, 6, 6]] for i in range(4): t = threading.Thread(target=job, args=(data[i], q)) t.start() threads.append(t) # Block all threads for thread in threads: thread.join() results = [] # Put each element in the new queue into the result list one by one for _ in range(4): results.append(q.get()) print(results)if __name__ == "__main__": multithreading()
design sketch :
5. Thread lock lockWhen multiple threads are started at the same time , Each thread will preempt computing resources , Can cause procedural confusion .
Take a chestnut :
When we select class hours in the course selection system , At present, there are still 2 Places , The three of us went to choose a course .
The order of course selection is stu1 stu2 stu3, The course selection process of the three students should be printed in turn , But the reality is :
# coding:utf-8import threadingimport timedef stu1(): print("stu1 Start choosing courses ") global course if course > 0: course -= 1 time.sleep(2) print("stu1 Successful course selection , Now the remaining places in basketball class are %d" % course) else: time.sleep(2) print("stu1 Course selection failed , The quota of basketball class is 0, Please choose another course ")def stu2(): print("stu2 Start choosing courses ") global course if course > 0: course -= 1 time.sleep(2) print("stu2 Successful course selection , Now the remaining places in basketball class are %d" % course) else: time.sleep(2) print("stu2 Course selection failed , The quota of basketball class is 0, Please choose another course ")def stu3(): print("stu3 Start choosing courses ") global course if course > 0: course -= 1 time.sleep(2) print("stu3 Successful course selection ") print(" The remaining places in basketball class are %d" %course) else: time.sleep(2) print("stu3 Course selection failed , The quota of basketball class is 0, Please choose another course ")if __name__ == "__main__": # Basketball class quota course = 2 T1 = threading.Thread(target=stu1, name="T1") T2 = threading.Thread(target=stu2, name="T2") T3 = threading.Thread(target=stu3, name="T3") T1.start() T2.start() T3.start()
design sketch :
To solve this situation , We use lock Thread synchronization lock , When threads execute concurrently , Ensure the atomicity of each thread execution . Effectively prevent the sharing of unified data , The chaos of concurrent thread execution .
The improved code is as follows :
# coding:utf-8import threadingimport timedef stu1(): global lock lock.acquire() print("stu1 Start choosing courses ") global course if course > 0: course -= 1 time.sleep(2) print("stu1 Successful course selection , Now the remaining places in basketball class are %d" % course) else: time.sleep(2) print("stu1 Course selection failed , The quota of basketball class is 0, Please choose another course ") lock.release()def stu2(): global lock lock.acquire() print("stu2 Start choosing courses ") global course if course > 0: course -= 1 print("stu2 Successful course selection , Now the remaining places in basketball class are %d" % course) else: time.sleep(1) print("stu2 Course selection failed , The quota of basketball class is 0, Please choose another course ") lock.release()def stu3(): global lock lock.acquire() print("stu3 Start choosing courses ") global course if course > 0: course -= 1 time.sleep(1) print("stu3 Successful course selection , Now the remaining places in basketball class are %d" % course) else: time.sleep(1) print("stu3 Course selection failed , The quota of basketball class is 0, Please choose another course ") lock.release()if __name__ == "__main__": # Basketball class quota course = 2 # Create a synchronization lock lock = threading.Lock() T1 = threading.Thread(target=stu1, name="T1") T2 = threading.Thread(target=stu2, name="T2") T3 = threading.Thread(target=stu3, name="T3") T1.start() T2.start() T3.start()
design sketch :
This is about Python Multithreaded instances in ( Simple and easy to understand ) This is the end of the article , More about Python Multi thread content please search the previous articles of software development network or continue to browse the relevant articles below. I hope you will support software development network more in the future !
p{margin:10px 0}.markdown-body
nl