Computer >> Máy Tính >  >> Lập trình >> Python

API phân luồng cấp thấp trong Python

Mô-đun '_thread' trong thư viện Python cung cấp giao diện cấp thấp để làm việc với các quy trình nhẹ có nhiều luồng chia sẻ không gian dữ liệu toàn cầu. Để đồng bộ hóa, các khóa đơn giản (còn được gọi là mutexes hoặc semaphores nhị phân) được xác định trong mô-đun này. Mô-đun tích hợp 'phân luồng' cung cấp một API phân luồng cấp cao hơn được xây dựng trên đầu mô-đun này.

start_new_thread ()

Chức năng cấp mô-đun này được sử dụng để mở một luồng mới trong quy trình hiện tại. Hàm nhận một đối tượng hàm làm đối số. Hàm này được gọi khi tạo thành công luồng mới. Khoảng thời gian của chức năng này tương ứng với tuổi thọ của luồng. Chuỗi có thể bị chặn bằng cách gọi hàm sleep ().

Đoạn mã sau là một ví dụ đơn giản về cơ chế luồng sử dụng mô-đun _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)

Hàm start_new_thread () sinh ra một luồng mới gọi hàm chạy song song. Có một vòng lặp trong hàm run () cũng như trong luồng chính của chương trình. Gọi hàm sleep () trong cả hai kết quả thực thi chồng chéo như được hiển thị bên dưới:-

main 1
child 1
main 2
child 2
main 3
child 3
main 4
child 4
main 5
child 5

Đồng bộ hóa giữa các luồng đạt được bằng cách sử dụng đối tượng Khóa. Hàm delivery_lock () trả về đối tượng khóa. Các phương pháp sau có sẵn cho nó

get ()

Phương thức này nhận được khóa vô điều kiện cho đến khi nó được giải phóng bởi một luồng khác. Mỗi lần chỉ có một luồng có thể nhận được một khóa. Giá trị trả về là Đúng nếu khóa được lấy thành công, Sai nếu không.

release ()

Phương pháp này giải phóng khóa. Khóa phải được mua trước đó, nhưng không nhất thiết phải bằng cùng một chuỗi.

Trong ví dụ sau, hai luồng được khai báo. Mỗi hàm run () gọi đồng thời. Một trong số họ có được khóa và tiến hành vào chức năng 'đồng bộ hóa' trong khi những người khác đang đợi.

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", ) )

Đầu ra

>>> t1 has acquired lock
**********
t1 has released lock
t2 has acquired lock
**********
t2 has released lock