โมดูล '_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