เธรดในวิทยาการคอมพิวเตอร์คือชุดคำสั่งที่สามารถจัดการได้อย่างอิสระโดยตัวจัดกำหนดการ ซึ่งเป็นส่วนหนึ่งของระบบปฏิบัติการ
หน้าที่หลักของ 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