โมดูล '_thread' ในไลบรารี Python จัดเตรียมอินเทอร์เฟซระดับต่ำสำหรับการทำงานกับกระบวนการน้ำหนักเบาที่มีเธรดหลายตัวที่แชร์พื้นที่ข้อมูลส่วนกลาง สำหรับการซิงโครไนซ์ การล็อกแบบง่าย (เรียกอีกอย่างว่า mutexes หรือสัญญาณไบนารี) ถูกกำหนดไว้ในโมดูลนี้ โมดูล 'threading' ในตัวมี API เธรดระดับสูงที่สร้างขึ้นบนโมดูลนี้
start_new_thread()
ฟังก์ชันระดับโมดูลนี้ใช้เพื่อเปิดเธรดใหม่ในกระบวนการปัจจุบัน ฟังก์ชันรับวัตถุฟังก์ชันเป็นอาร์กิวเมนต์ ฟังก์ชันนี้จะถูกเรียกใช้เมื่อสร้างเธรดใหม่สำเร็จ ช่วงของฟังก์ชันนี้สอดคล้องกับอายุการใช้งานของเกลียว เธรดอาจถูกบล็อกโดยการเรียกฟังก์ชัน sleep()
โค้ดต่อไปนี้เป็นตัวอย่างง่ายๆ ของกลไกเธรดโดยใช้โมดูล _thread
import _thread import time def run( threadName): count = 0 for i in range(1,6): time.sleep(5) print ( threadName, i ) _thread.start_new_thread( run, ("child", ) ) for i in range(1,6): print ( 'main', i ) time.sleep(5)
ฟังก์ชัน start_new_thread() จะสร้างเธรดใหม่ที่เรียกใช้ฟังก์ชันแบบคู่ขนาน มีการวนซ้ำในฟังก์ชัน run() เช่นเดียวกับในเธรดหลักของโปรแกรม ฟังก์ชันการเรียกเข้าสู่โหมดสลีป () ทั้งสองส่งผลให้มีการเรียกใช้งานคาบเกี่ยวกันดังแสดงด้านล่าง:−
main 1 child 1 main 2 child 2 main 3 child 3 main 4 child 4 main 5 child 5
การซิงโครไนซ์ระหว่างเธรดทำได้โดยใช้วัตถุล็อค ฟังก์ชัน allocate_lock() ส่งกลับวัตถุล็อค มีวิธีการดังต่อไปนี้
ได้รับ()
วิธีนี้รับการล็อกโดยไม่มีเงื่อนไขจนกว่าจะถูกปล่อยโดยเธรดอื่น ครั้งละหนึ่งเธรดเท่านั้นที่สามารถล็อคได้ ค่าที่ส่งกลับจะเป็น True หากได้รับล็อคสำเร็จ และเป็นค่าเท็จหากไม่ใช่
ปล่อย()
วิธีนี้จะปลดล็อค ต้องได้รับกุญแจมาก่อนหน้านี้ แต่ไม่จำเป็นต้องมาจากเธรดเดียวกัน
ในตัวอย่างต่อไปนี้ มีการประกาศสองเธรด แต่ละอันเรียกใช้ฟังก์ชัน run() พร้อมกัน หนึ่งในนั้นได้รับล็อคและเข้าสู่ฟังก์ชัน 'ซิงโครไนซ์' ในขณะที่คนอื่นรอ
import _thread import time def run( threadName): lock.acquire() synchronized(threadName) lock.release() def synchronized(threadName): print (threadName,"has acquired lock") counter = 10 while counter: time.sleep(1) print ('*', end='') counter = counter-1 print('\n{} has released lock'.format( threadName)) lock = _thread.allocate_lock() _thread.start_new_thread( run, ("t1", ) ) _thread.start_new_thread( run, ("t2", ) )
ผลลัพธ์
>>> t1 has acquired lock ********** t1 has released lock t2 has acquired lock ********** t2 has released lock