เธรดในวิทยาการคอมพิวเตอร์คือชุดคำสั่งที่สามารถจัดการได้อย่างอิสระโดยตัวจัดกำหนดการ ซึ่งเป็นส่วนหนึ่งของระบบปฏิบัติการ
หน้าที่หลักของ Threading คือการเรียกใช้หลายเธรดพร้อมกัน เธรดหมายถึงงานที่แตกต่างกัน การเรียกใช้ฟังก์ชันในโปรแกรม และการรันหลายเธรดพร้อมกันซึ่งไม่ได้หมายความว่าจะถูกดำเนินการบนเครื่องที่ต่างกัน
มัลติเธรดใช้ในสองกรณี
-
เมื่อเอาท์พุตของโปรแกรมย่อยมารวมกับโปรแกรมหลัก
-
เมื่อโปรแกรมหลักประกอบด้วยโค้ดที่ค่อนข้างเป็นอิสระจากกัน
โมดูลเธรด
Python มีโมดูล Threading ซึ่งมีประสิทธิภาพมากและให้การสนับสนุนเธรดในระดับสูงด้วย
โมดูลเธรดกำหนดฟังก์ชันจำนวนมากที่ใช้เพื่อรับข้อมูลที่เกี่ยวข้องกับเธรด และฟังก์ชันเหล่านี้จะถูกดำเนินการโดยอัตโนมัติ
threading.active_count()
ฟังก์ชันนี้จะคืนค่าจำนวนของออบเจกต์เธรดที่ยังมีชีวิตอยู่ในปัจจุบัน ที่นี่จำนวนที่ส่งคืนจะเท่ากับความยาวของรายการที่ส่งคืนโดย enumerate()
threading.current_thread()
ฟังก์ชันนี้จะคืนค่าออบเจ็กต์ Thread ปัจจุบันและสอดคล้องกับเธรดการควบคุมของผู้เรียก
threading.get_ident()
ฟังก์ชันนี้ส่งคืน 'ตัวระบุเธรด' ของเธรดปัจจุบัน เป็นจำนวนเต็มที่ไม่ใช่ศูนย์
threading.enumerate()
ฟังก์ชันนี้จะส่งคืนรายการของออบเจ็กต์ Thread ทั้งหมดที่มีอยู่ในปัจจุบัน รวมถึง daemonic threads, ฟังก์ชัน current_thread() จะสร้างเธรดจำลองและเธรดหลัก และไม่รวมเธรดและเธรดที่สิ้นสุดการทำงานที่ยังไม่ได้เริ่มต้น
threading.main_thread()
ฟังก์ชันนี้จะคืนค่าออบเจ็กต์ Thread หลัก
threading.settrace(func)
เมื่อเธรดทั้งหมดเริ่มต้นจากโมดูลเธรด ให้ตั้งค่าฟังก์ชันการติดตาม ก่อนเรียกใช้เมธอด run() ฟังก์ชันนี้จะถูกส่งไปยัง sys.settrace() สำหรับแต่ละเธรด
threading.setprofile(func)
เมื่อเธรดทั้งหมดเริ่มต้นจากโมดูลเธรด ให้ตั้งค่าฟังก์ชันโปรไฟล์ ก่อนเรียกใช้เมธอด run() ฟังก์ชันนี้จะถูกส่งไปยัง sys.setprofile() สำหรับแต่ละเธรด
threading.stack_size([ขนาด])
ฟังก์ชันนี้จะคืนค่าขนาดของเธรดสแต็กและจะใช้เมื่อสร้างเธรดใหม่
เธรด.TIMEOUT_MAX
นี่คือค่าคงที่ซึ่งมีค่าสูงสุดที่อนุญาตสำหรับพารามิเตอร์การหมดเวลาของฟังก์ชันการบล็อก (Lock.acquire(), RLock.acquire(), Condition.wait() เป็นต้น)
โค้ดตัวอย่าง
import threading def trace_function(): print("Passing the trace function") def profile(): print("PROFILE THREAD: " + str(threading.current_thread().getName())) class mythread(threading.Thread): def __init__(self, thread_name, thread_ID): threading.Thread.__init__(self) self.thread_name = thread_name self.thread_ID = thread_ID def run(self): print(str(self.thread_ID)); print("ACTIVE THREADS ARE: "+ str(threading.active_count())) print("CURRENT THREAD IS: " + str(threading.current_thread().getName())) my_thread1 = mythread("PP", 500) my_thread2 = mythread("PythonProgram", 1000); print("NAME OF THE MAIN THREAD: " + str(threading.main_thread().getName())) print("IDENTIFICATION OF MAIN THREAD: "+ str(threading.get_ident())) print("STACK SIZE = " + str(threading.stack_size())) print(threading.settrace(trace_function())) threading.setprofile(profile()) my_thread1.start() my_thread2.start() print("LIST OF ENUMERATION: ") print(threading.enumerate()) print("EXIT")
ผลลัพธ์
NAME OF THE MAIN THREAD: MainThread IDENTIFICATION OF MAIN THREAD: 5436 STACK SIZE = 0 Passing the trace function None PROFILE THREAD: MainThread 500 1000LIST OF ENUMERATION: ACTIVE THREADS ARE: 6 [<_MainThread(MainThread, started 5436)>, <Thread(Thread-4, started daemon 1960)>, <Heartbeat(Thread-5, started daemon 6452)>, <HistorySavingThread(IPythonHistorySavingThread, started 4304)>, <mythread(Thread-8, started 8460)>, <mythread(Thread-9, started 4668)>] EXIT CURRENT THREAD IS: Thread-8 ACTIVE THREADS ARE: 5 CURRENT THREAD IS: Thread-9