Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

ความขนานแบบเธรดใน Python


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

หน้าที่หลักของ 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