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

Python เธรดระดับต่ำ API


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