An toàn luồng trong python

Bạn có thể tạo một danh sách toàn chủ đề bằng cách sử dụng từ khóa loại trừ lẫn nhau (MUTEX) thông qua Threading lớp. Khóa. danh sách an toàn luồng bằng cách sử dụng khóa loại trừ lẫn nhau (mutex) thông qua luồng. khóa lớp

Nội dung chính Hiển thị

Trong hướng dẫn này, bạn sẽ khám phá cách phát triển một danh sách toàn chủ đề trong Python

Started any

  • Cần liệt kê một chủ đề toàn bộ
  • Hầu hết các danh sách hoạt động là nguyên tử
  • Hoạt động danh sách nguyên tử rất dễ bị phá vỡ
  • Cách phát triển danh sách toàn chủ đề
  • Ví dụ về danh sách toàn chủ đề
  • Thay thế cho một danh sách toàn chủ đề
  • Ví dụ về việc sử dụng hàng đợi an toàn chủ đề
  • Đọc thêm
  • mang đi

Cần liệt kê một chủ đề toàn bộ

Hầu hết các danh sách hoạt động là nguyên tử

Hoạt động danh sách nguyên tử rất dễ bị phá vỡ

Cách phát triển danh sách toàn chủ đề

Ví dụ về phân luồng chủ đề danh sách. lớp chủ đề

Thay thế cho một danh sách toàn chủ đề

  • Ví dụ về việc sử dụng hàng đợi an toàn chủ đề

Đọc thêm

mang đi

Một chủ đề là một chủ đề thực thi trong một chương trình máy tính

Hầu hết các danh sách hoạt động là nguyên tử

Hoạt động danh sách nguyên tử rất dễ bị phá vỡ

Cách phát triển danh sách toàn chủ đềDanh sách lớp

Ví dụ về danh sách toàn chủ đề

Thay thế cho một danh sách toàn chủ đề

Ví dụ về việc sử dụng hàng đợi an toàn chủ đề

Đọc thêm

Đặc biệt

  • Takeawaysappend()
  • Một chủ đề là một chủ đề thực thi trong một chương trình máy tính. gia hạn()
  • Mỗi chương trình Python có ít nhất một luồng thực thi được gọi là luồng chính. Cả hai quy trình và luồng được tạo và quản lý bởi hệ điều hành cơ bản
  • Đôi khi chúng ta có thể cần tạo các luồng bổ sung trong chương trình của chúng ta để thực hiện mã đồng thời. []
  • Python cung cấp khả năng tạo và quản lý các luồng mới thông qua mô-đun luồng và luồng lớp. nhạc pop()
  • Bạn có thể tìm hiểu thêm về các chủ đề Python trong hướng dẫn. loại()

Chủ đề trong Python. Hướng dẫn hoàn chỉnh

  • Trong việc lập trình đồng thời, chúng ta có thể cần chia sẻ cấu trúc dữ liệu danh sách cấu trúc giữa các luồng

Nhiều luồng có thể cần kết nối dữ liệu vào cùng một danh sách, các luồng khác có thể muốn xóa các mục hoặc kiểm tra độ dài của danh sách

Là danh sách an toàn trong Python và nếu không, làm thế nào chúng ta có thể làm cho nó an toàn?

Nhiều biến hoạt động phổ biến trong danh sách là nguyên tử, có nghĩa là chúng an toàn cho luồng

Nhớ lại, một danh sách là một ví dụ của lớp danh sách.
Tải xuống bảng cheat PDF MIỄN PHÍ của tôi

Hoạt động danh sách nguyên tử rất dễ bị phá vỡ

Cách phát triển danh sách toàn chủ đề

Ví dụ về danh sách toàn chủ đề

  • Thay thế cho một danh sách toàn chủ đề
  • Ví dụ về việc sử dụng hàng đợi an toàn chủ đề
  • Đọc thêm

mang đi

Một chủ đề là một chủ đề thực thi trong một chương trình máy tính

Mỗi chương trình Python có ít nhất một luồng thực thi được gọi là luồng chính. Cả hai quy trình và luồng được tạo và quản lý bởi hệ điều hành cơ bản

Đôi khi chúng ta có thể cần tạo các luồng bổ sung trong chương trình của chúng ta để thực hiện mã đồng thời

Python cung cấp khả năng tạo và quản lý các luồng mới thông qua mô-đun luồng và luồng lớp

Bạn có thể tìm hiểu thêm về các chủ đề Python trong hướng dẫn

Đọc thêm

mang đi


Một chủ đề là một chủ đề thực thi trong một chương trình máy tính

Mỗi chương trình Python có ít nhất một luồng thực thi được gọi là luồng chính. Cả hai quy trình và luồng được tạo và quản lý bởi hệ điều hành cơ bản

Đôi khi chúng ta có thể cần tạo các luồng bổ sung trong chương trình của chúng ta để thực hiện mã đồng thời

Python cung cấp khả năng tạo và quản lý các luồng mới thông qua mô-đun luồng và lớp luồng.
 


Cách phát triển danh sách toàn chủ đề

Ví dụ về danh sách toàn chủ đề

Thay thế cho một danh sách toàn chủ đề

Ví dụ về việc sử dụng hàng đợi an toàn chủ đề

A could show of stream. lock could be used to protect the list. xâu chuỗi. Khóa có thể được sử dụng để bảo vệ danh sách

Bạn có thể tìm hiểu thêm về khóa Mutex tại đây

  • Cách sử dụng từ khóa mutex trong Python

Khóa này phải được mua trước khi hoạt động trong danh sách và được phát hành khi hoạt động trong danh sách đã hoàn thành

Ví dụ

.... .

# has been started

khóa. thu được(). có được()

# active in the list

.... .

# has been started

khóa. phát hành(). phát hành()

# active in the list

# Phát hành khóa

Ví dụ

.... .

# has been started

# hoạt động trong danh sáchkhóa.

# active in the list

.... .

# has been started

# active in the list

# Phát hành khóathreading. lớp RLock. Nó sẽ cho phép lấy lại khóa bởi cùng một luồng

Điều này đảm bảo rằng chỉ có một luồng tại một thời điểm có thể hoạt động trong danh sách

  • Giao diện Trình quản lý cảnh báo trên khóa có thể được sử dụng để đơn giản hóa thao tác này, cho phép khóa được giải phóng tự động

with key

Điều này bổ sung thêm chi phí, làm cho mỗi hoạt động có danh sách chậm hơn nhiều so với nếu không có khóa. Lợi ích là tin rằng các điều kiện chủng tộc với danh sách đã được loại bỏ hoàn toàn. Liệt kê lớp và triển khai các phiên bản an toàn cho luồng của tất cả hoặc một tập hợp con các hàm

Nếu thiết kế của bạn có một số chức năng được bọc, hãy gọi các chức năng được bọc khác, thì từ khóa reentrant được ưa thích, để tránh bế tắc. Liệt kê lớp, ngoại trừ các chức năng trên lớp là chủ đề an toàn

Điều này có thể đạt được thông qua Threading lớp. ổ khóa. Nó sẽ cho phép khóa được thu bởi cùng một luồng một lần nữa. Danh sách lớp

Bạn có thể tìm hiểu thêm về reentrant key tại đây. Danh sách an toàn cho luồng, đây là cấu trúc dữ liệu được thiết kế cho trường hợp sử dụng an toàn cho luồng phải được xử lý hết sức cẩn thận

Cách sử dụng khóa Reentrant trong PythonThreadSafeList

Hãy phát triển một lớp kết thúc một số hoạt động danh sách biến phổ biến theo cách an toàn cho luồng

classThreadSafeList(). Danh sách ThreadSafe().

Một cách tiếp cận sẽ là ghi đè lên các lớp Danh sách và khai thác các phiên bản an toàn luồng của tất cả hoặc một tập hợp con của các chức năng

Một cách tiếp cận khác là xác định một lớp mới có cùng giao diện với lớp Danh sách, ngoại trừ các chức năng trên lớp là toàn bộ cho luồng

Cách tiếp cận cuối cùng là xác định một lớp mới với các hoạt động giống như danh sách, không thể giống với giao diện của lớp Danh sách

Tôi thích cách tiếp cận thứ hai để làm rõ người dùng của lớp rằng họ đang làm việc với một cái gì đó khác biệt. Nó không phải là một sự thay thế các khe cắm cho toàn bộ danh sách, nó là một cấu trúc dữ liệu được thiết kế cho một trường hợp sử dụng toàn bộ luồng phải được quản lý theo một cách cực kỳ chăm sóc. __init__(bản thân).

Đầu tiên, chúng ta có thể xác định lớp với một tên rõ ràng như ThreadSafelist. # khởi tạo danh sách

    bản thân. _list=list()bản thân. _list=danh sách()

# lớp tùy chỉnh gói danh sách để làm cho nó an toàn# khởi tạo khóa

    bản thân. _lock=Lock()self. _lock =Khóa()

#

Tiếp theo, chúng ta có thể xác định một hàm khởi động để tạo cả danh sách bộ nội dung và khóa được sử dụng để bảo vệ danh sách dưới dạng các biến thể hiện trên lớp

  • # người xây dựngappend()
  • def __init __ (tự). nhạc pop()
  •  
  •  

Tiếp theo, chúng ta có thể bắt đầu thêm chức năng mà chúng ta có thể cần trong ứng dụng của mình

Trong trường hợp này, chúng tôi sẽ cung cấp các hoạt động trong danh sách

Add a value information through append()

Delete and return a value through pop()

Truy cập nhật giá trị tại một mục thông tin duy nhất qua get (). nối thêm(bản thân,giá trị . ):

Nhận độ dài của danh sách thông qua độ dài (). # giành được khóa

Place thao tác trong danh sách sẽ bị khóa bởi từ khóa bằng giao diện Trình quản lý ngữ cảnh. với chính mình. _khóa.

Giao diện trình quản lý cảnh bảo được ưa thích như một hoạt động trong danh sách có thể gây ra lỗi (ví dụ:. chỉ mục ra khỏi giới hạn) và chúng tôi cần đảm bảo rằng từ khóa sẽ luôn được phát triển, bất kể thành công hay thất bại của hoạt động. # nối thêm giá trị

        bản thân. _danh sách. append(value)self. _list. chắp thêm(giá trị)

Ví dụ. method for active subhell được liệt kê dưới đây

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

# Add value to list

def tiêu (tự, giá trị). bốp(chính mình).

Nhận độ dài của danh sách thông qua độ dài (). # giành được khóa

Place thao tác trong danh sách sẽ bị khóa bởi từ khóa bằng giao diện Trình quản lý ngữ cảnh. với chính mình. _khóa.

Giao diện trình quản lý cảnh bảo được ưa thích như một hoạt động trong danh sách có thể gây ra lỗi (ví dụ:. chỉ mục ra khỏi giới hạn) và chúng tôi cần đảm bảo rằng từ khóa sẽ luôn được phát triển, bất kể thành công hay thất bại của hoạt động. # bật một giá trị từ danh sách

        tự trả lại. _danh sách. pop()return self. _list. bật()

Ví dụ. method for active subhell được liệt kê dưới đây

# Add value into listget(self,index):

Nhận độ dài của danh sách thông qua độ dài (). # giành được khóa

Place thao tác trong danh sách sẽ bị khóa bởi từ khóa bằng giao diện Trình quản lý ngữ cảnh. với chính mình. _khóa.

Giao diện trình quản lý cảnh bảo được ưa thích như một hoạt động trong danh sách có thể gây ra lỗi (ví dụ:. chỉ mục ra khỏi giới hạn) và chúng tôi cần đảm bảo rằng từ khóa sẽ luôn được phát triển, bất kể thành công hay thất bại của hoạt động. # đọc giá trị tại chỉ mục

        tự trả lại. _list[index]returnself. _list[index]

Ví dụ. method for active subhell được liệt kê dưới đây

# Add value into listlength(self):

Nhận độ dài của danh sách thông qua độ dài (). # giành được khóa

Place thao tác trong danh sách sẽ bị khóa bởi từ khóa bằng giao diện Trình quản lý ngữ cảnh. với chính mình. _khóa.

        returnlen(self. _list)returnlen(self._list)

Giao diện quản lý cảnh bảo được ưa thích như một hoạt động trong danh sách có thể gây ra lỗi (ví dụ:. chỉ mục ra khỏi giới hạn) và chúng tôi cần đảm bảo rằng từ khóa sẽ luôn được phát triển, bất kể thành công hay thất bại của hoạt động

Ví dụ. method for active subhell được liệt kê dưới đây

# Add value to list

def expend (count, value)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

# lớp tùy chỉnh gói danh sách để làm cho nó an toàn

classThreadSafeList(). Danh sách ThreadSafe().

& nbsp; # constructor

& nbsp; . def __init__(self) . :

  # initialize the list

        bản thân. _list=list()bản thân. _list=danh sách()

  # initialize the lock

        bản thân. _lock=Lock()self. _lock= Khóa()

& nbsp; # add a value to the list

  . def append(self, . value):

  # acquire the lock

  . with self._khóa.

  # append the value

             chính bạn. _danh sách. append(value)self. _list. chắp thêm(giá trị)

& nbsp; # remove and return the last value from the list

  . def pop(self) . :

  # acquire the lock

  . with self._khóa.

  # pop a value from the list

             returnself. _danh sách. pop()returnself. _list. bật()

& nbsp; # read a value from the list at an index

  . def get(self, . index):

  # acquire the lock

  . with self._khóa.

  # read a value at the index

             returnself. _list[index]return self. _list[index]

& nbsp; # return the number of items in the list

  . def độ dài(bản thân) . :

  # acquire the lock

  . with self._khóa.

             returnlen(self. _list)returnlen(self._list)

 

 

 

 

 

 

 

 

  . ThreadSafeList, sau đó lặp 100.000 lần, thêm một giá trị vào danh sách mỗi lần lặp

Là một tiện ích mở rộng tiện ích, hãy thử thêm một số hoạt động bổ sung mà bạn muốn sử dụng trong danh sách của mình như Sort () và Extend (). hàm add_items() bên dưới thực hiện điều này

Ngoài ra, hãy cố gắng thêm một số hoạt động liên quan đến các hoạt động tổng hợp trong danh sách, chẳng hạn như chỉ mục () hoặc sau này ()

Tiếp theo, hãy để Lừa trình diễn ra một chủ đề toàn bộ danh sách trong một ví dụ đang làm việc. add_items(safe_list).

    foriinrange(100000). choitrongphạm vi( . 100000):

        safe_list. append(i)safe_list. chắp thêm(i)

Ví dụ về danh sách toàn chủ đề

Chúng ta có thể phát triển một ví dụ về công việc sử dụng danh sách toàn bộ luồng từ nhiều luồng. . .

Trong ví dụ này, chúng tôi sẽ tạo ra mười luồng và mỗi chủ đề sẽ cố gắng thêm 100. 000 mục vào danh sách đồng thời. Kết quả dự kiến ​​sẽ là một danh sách với 1. 000. 000 mặt hàng

safe_list=ThreadSafeList()=ThreadSafeList()

Một lần nữa, điều này có thể đạt được với danh sách Python mặc định bằng phiên bản hiện tại (v3. 10) tham chiếu của thông tin trình dịch Python, nhưng nó có thể hoặc không phải là bằng chứng trong tương lai cho các thay đổi trong trình thông dịch. Do đó, chúng tôi sẽ sử dụng lớp danh sách một chủ đề toàn chủ đề mà chúng tôi đã phát triển trong phần trước. add_items() và được truyền cùng một ThreadSafeList làm đối số

Đầu tiên, chúng ta có thể xác định một chức năng được thực hiện bởi mỗi luồng công nhân

Chúng ta có thể phát triển một ví dụ về công việc sử dụng danh sách toàn bộ luồng từ nhiều luồng. . .

Trong ví dụ này, chúng tôi sẽ tạo ra mười luồng và mỗi chủ đề sẽ cố gắng thêm 100. 000 mục vào danh sách đồng thời. Kết quả dự kiến ​​sẽ là một danh sách với 1. 000. 000 mặt hàng

threads=[Thread(target=add_items,args=(safe_list,))foriinrange(10)]=[Thread(target=add_items,args=(safe_list,))fori inrange(10)]

Một lần nữa, điều này có thể đạt được với danh sách Python mặc định bằng phiên bản hiện tại (v3. 10) tham chiếu của thông tin trình dịch Python, nhưng nó có thể hoặc không phải là bằng chứng trong tương lai cho các thay đổi trong trình thông dịch. Do đó, chúng tôi sẽ sử dụng lớp danh sách một chủ đề toàn chủ đề mà chúng tôi đã phát triển trong phần trước

Chúng ta có thể phát triển một ví dụ về công việc sử dụng danh sách toàn bộ luồng từ nhiều luồng. . .

Trong ví dụ này, chúng tôi sẽ tạo ra mười luồng và mỗi chủ đề sẽ cố gắng thêm 100. 000 mục vào danh sách đồng thời. Kết quả dự kiến ​​sẽ là một danh sách với 1. 000. 000 mặt hàng

Một lần nữa, điều này có thể đạt được với danh sách Python mặc định bằng phiên bản hiện tại (v3. 10) tham chiếu của thông tin trình dịch Python, nhưng nó có thể hoặc không phải là bằng chứng trong tương lai cho các thay đổi trong trình thông dịch. Do đó, chúng tôi sẽ sử dụng lớp danh sách một chủ đề toàn chủ đề mà chúng tôi đã phát triển trong phần trước. chuỗi trongchuỗi.

    chủ đề. start()chuỗi. bắt đầu()

Đầu tiên, chúng ta có thể xác định một chức năng được thực hiện bởi mỗi luồng công nhân

Chúng ta có thể phát triển một ví dụ về công việc sử dụng danh sách toàn bộ luồng từ nhiều luồng. . .

Trong ví dụ này, chúng tôi sẽ tạo ra mười luồng và mỗi chủ đề sẽ cố gắng thêm 100. 000 mục vào danh sách đồng thời. Kết quả dự kiến ​​sẽ là một danh sách với 1. 000. 000 mặt hàng

Một lần nữa, điều này có thể đạt được với danh sách Python mặc định bằng phiên bản hiện tại (v3. 10) tham chiếu của thông tin trình dịch Python, nhưng nó có thể hoặc không phải là bằng chứng trong tương lai cho các thay đổi trong trình thông dịch. Do đó, chúng tôi sẽ sử dụng lớp danh sách một chủ đề toàn chủ đề mà chúng tôi đã phát triển trong phần trước. ('Main chờ chủ đề. ')

Một lần nữa, điều này có thể đạt được với danh sách Python mặc định bằng phiên bản hiện tại (v3. 10) tham chiếu của thông tin trình dịch Python, nhưng nó có thể hoặc không phải là bằng chứng trong tương lai cho các thay đổi trong trình thông dịch. Do đó, chúng tôi sẽ sử dụng lớp danh sách một chủ đề toàn chủ đề mà chúng tôi đã phát triển trong phần trước. chuỗi trongchuỗi.

    chủ đề. tham gia()chuỗi. tham gia()

Đầu tiên, chúng ta có thể xác định một chức năng được thực hiện bởi mỗi luồng công nhân

Chúng ta có thể phát triển một ví dụ về công việc sử dụng danh sách toàn bộ luồng từ nhiều luồng. . .

Trong ví dụ này, chúng tôi sẽ tạo ra mười luồng và mỗi chủ đề sẽ cố gắng thêm 100. 000 mục vào danh sách đồng thời. Kết quả dự kiến ​​sẽ là một danh sách với 1. 000. 000 mặt hàng

Một lần nữa, điều này có thể đạt được với danh sách Python mặc định bằng phiên bản hiện tại (v3. 10) tham chiếu của thông tin trình dịch Python, nhưng nó có thể hoặc không phải là bằng chứng trong tương lai cho các thay đổi trong trình thông dịch. Do đó, chúng tôi sẽ sử dụng lớp danh sách một chủ đề toàn chủ đề mà chúng tôi đã phát triển trong phần trước. (f'Kích thước danh sách. {safe_list. độ dài()}')

Đầu tiên, chúng ta có thể xác định một chức năng được thực hiện bởi mỗi luồng công nhân

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

#Trăn Siêu Nhanh. com

# Ví dụ về danh sách toàn chủ đề

từ luồng nhập luồngluồng nhập Luồng

từ khóa nhập khẩu renluồng nhập Khóa

# lớp tùy chỉnh gói danh sách để làm cho nó an toàn

classThreadSafeList(). Danh sách ThreadSafe().

& nbsp; # constructor

& nbsp; . def __init__(self) . :

  # initialize the list

        bản thân. _list=list()bản thân. _list=danh sách()

  # initialize the lock

        bản thân. _lock=Lock()self. _lock=Khóa()

& nbsp; # add a value to the list

  . def append(self, . value):

  # acquire the lock

  . with self._khóa.

  # append the value

             chính bạn. _danh sách. append(value)self. _list. chắp thêm(giá trị)

& nbsp; # remove and return the last value from the list

  . def pop(self) . :

  # acquire the lock

  . with self._khóa.

  # pop a value from the list

             returnself. _danh sách. pop()returnself. _list. bật()

& nbsp; # read a value from the list at an index

  . def get(self, . index):

  # acquire the lock

  . with self._khóa.

  # read a value at the index

             returnself. _list[index]return self. _list[index]

& nbsp; # return the number of items in the list

  . def độ dài(bản thân) . :

  # acquire the lock

  . with self._khóa.

             returnlen(self. _list)returnlen(self._list)

 

& nbsp; . add_items(safe_list):

    foriinrange(100000). cho itrongphạm vi( . 100000):

        safe_list. append(i)safe_list. chắp thêm(i)

 

safe_list=ThreadSafeList()=ThreadSafeList()

 

threads=[Thread(target=add_items,args=(safe_list,))foriinrange(10)]=[Thread(target=add_items,args=(safe_list,))foriin range(10)]

 

  . chuỗi trongchuỗi.

    chủ đề. start()chuỗi. bắt đầu()

 

& nbsp; . '('Main waiting for threads...')

  . chuỗi trongchuỗi.

    chủ đề. tham gia()chuỗi. tham gia()

 

& nbsp; . {safe_list. độ dài()}'(f'List size: {safe_list.length()}')

 

# Thêm các mục vào danh sách

def add_items (toàn_danh sách)

# Tạo danh sách toàn chủ đề Lớp ThreadSafeList có thể là thêm chức năng để một luồng có thể lấy khóa một lần và thêm nhiều mục vào danh sách hàng loạt

# Định cấu hình các luồng để thêm vào danh sách

# Bắt đầu chủ đề

chủ đề hướng tới chủ đề

# Chờ tất cả các luồng kết thúc

in ('Chờ các chủ đề chính. ')

# Báo cáo số lượng mục trong danh sách

in (size f'list. {an_list. chiều dài ()} ')

Chạy ví dụ đầu tiên để tạo ra một danh sách có thể hiển thị toàn bộ luồng của chúng tôi, bộ nội dung xác định một danh sách mới có thể hiển thị và khóa để bảo vệ danh sách

Sau đó, chúng tôi định cấu hình và bắt đầu mười luồng, mỗi chủ đề rất cố gắng thêm 100. 000 mục vào danh sách

Mỗi cuộc gọi để kết nối () trên danh sách toàn bộ luồng được bảo vệ bởi từ khóa, đảm bảo rằng chỉ có một luồng có thể thêm một mục vào danh sách tại một thời điểm

Một tiến trình cải tiến hữu ích cho lớp ThreadSafelist có thể là thêm một hàm để một luồng có thể lấy khóa một lần và thêm nhiều mục vào danh sách theo đợt. mô-đun hàng đợi, chẳng hạn như hàng đợi. Hàng đợi và hàng đợi. các lớp SimpleQueue

Chặn luồng chính cho đến khi tất cả mười luồng mới chấm dứt. xếp hàng. Lớp hàng đợi được thiết kế đặc biệt để đảm bảo an toàn cho luồng trong môi trường lập trình đồng thời

Cuối cùng, tất cả các chủ đề kết thúc việc bổ sung các mục của họ, các luồng chính bị chặn và báo cáo độ dài của danh sách. xếp hàng. lớp xếp hàng

.... .

# Tạo hàng đợi cho toàn bộ chủ đề

queue=queue. Hàng đợi()=hàng đợi. Hàng đợi()

Chúng ta có thể thêm các mục vào hàng đợi theo cách an toàn chủ đề bằng cách sử dụng hàm put (). hàm put()

Ví dụ

.... .

# Add a item into queue theo cách an toàn cho luồng

hàng đợi. đặt(mục). đặt(mục)

Chúng ta có thể xóa các mục khỏi hàng đợi theo cách an toàn luồng bằng cách sử dụng hàm get(). hàm get()

Ví dụ

.... .

# Add a item into queue theo cách an toàn cho luồng

item=queue. get()=hàng đợi. nhận()

Chúng ta có thể xóa các mục khỏi hàng đợi theo cách an toàn luồng bằng cách sử dụng hàm get()

# Nhận mục tiếp theo từ hàng đợi theo cách an toàn chủ đề mô-đun và lớp

Các lớp chờ đợi này được thiết kế để nhanh chóng, các đối tượng hóa cách cấu trúc được giữ an toàn cho các chủ đề khi thực hiện theo cách nhanh nhất và phù hợp nhất cho phiên bản Python hiện tại

Chúng ta có thể tìm thấy điều này nếu chúng ta xem lại mã nguồn cho mô-đun-hàng đợi và các lớp. put() không sử dụng khóa mutex bên trong

Như vậy, một số hoạt động được thực hiện trực tiếp, dựa trên bản chất nguyên tử của lớp Danh sách. qsize() và kiểm tra xem hàng đợi đã đầy qua full() hay rỗng qua empty()

Ví dụ. set a item with put() not use the mutex key in. xâu chuỗi. Điều kiện các đối tượng, cho phép các luồng chờ nhận các mục từ hàng đợi cho đến khi có các mục mới hoặc chờ đưa các mục vào hàng đợi cho đến khi nó không đầy. Những điều kiện này cũng chia sẻ cùng một mutex

Các hoạt động khác liên quan đến tổng hợp các hoạt động trong danh sách được bảo vệ bởi từ khóa mutex bên trong như kiểm tra kích thước của hàng đợi thông qua hàm qsize () và kiểm tra xem hàng đợi có đầy đủ thông tin qua đầy đủ hay không . được()

Ngoài ra, queue cung cấp một số khả năng queue/thông báo thông báo qua các luồng nội bộ. Đối tượng điều kiện, cho phép các chủ đề chờ đợi các mục từ hàng đợi cho đến khi có các mục mới hoặc chờ đặt các mục hàng đợi cho đến khi nó không đầy đủ. Những điều kiện này cũng chia sẻ cùng một mutex

Các hoạt động đầu tiên có một điều kiện sử dụng cùng một khóa mutex bên trong cũng được bảo vệ. Một ví dụ là nhận các mục từ hàng đợi thông qua get ()

Tôi khuyến khích bạn nên sử dụng một lớp hàng thay vì phát triển lớp danh sách toàn bộ luồng, nếu nó cung cấp tất cả hoặc hầu hết các chức năng bạn yêu cầu trong ứng dụng của mình. xếp hàng. Hàng đợi thay vì lớp ThreadSafeList của chúng tôi

Ví dụ về việc sử dụng hàng đợi một hàm toàn chủ đềadd_items() gọi hàm put() để thêm các mục vào hàng đợi

Chúng tôi có thể cập nhật ví dụ danh sách toàn chủ đề của mình để sử dụng hàng đợi. queue thay vì lớp ThreadSafelist của chúng tôi

Đầu tiên, chúng tôi phải cập nhật hàm add_items () của chúng tôi để gọi put () để thêm các mục trên hàng đợi

Phiên bản cập nhật chức năng của chức năng được liệt kê dưới đây. add_items(safe_list).

    foriinrange(100000). choitrongphạm vi( . 100000):

        safe_list. put(i)safe_list. đặt(i)

# Thêm các mục vào danh sách hàng đợi. Xếp hàng

.... .

def add_items (toàn_danh sách)

safe_list=Queue()=Hàng đợi()

Sau đó, chúng ta có thể xác định toàn bộ các biến của chúng ta là một ví dụ của hàng đợi. xếp hàng. hàm qsize() trên hàng đợi

.... .

# Tạo danh sách toàn chủ đề (Đang chờ)

Cuối cùng, khi kiểm tra kích thước của cấu trúc ở cuối chương trình, chúng ta có thể gọi hàm qsize () trên hàng đợi. (f'Kích thước danh sách. {safe_list. qsize()}')

# Báo cáo số lượng mục trong danh sách

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

in (size f'list. {an_list. qsize ()} ')

Buộc lại với nhau, ví dụ hoàn chỉnh được liệt kê dưới đây

# SuperfastPython. comluồng nhập Luồng

# Ví dụ về danh sách toàn chủ đề thông qua hàng đợihàng đợi nhập Hàng đợi<

Đầu tiên, chúng tôi phải cập nhật hàm add_items () của chúng tôi để gọi put () để thêm các mục trên hàng đợi

Phiên bản cập nhật chức năng của chức năng được liệt kê dưới đây. add_items(safe_list).

    foriinrange(100000). cho itrongphạm vi( . 100000):

        safe_list. put(i)safe_list. đặt(i)

def add_items (toàn_danh sách)

safe_list=Queue()=Hàng đợi()

Sau đó, chúng ta có thể xác định toàn bộ các biến của chúng ta là một ví dụ của hàng đợi. xếp hàng

threads=[Thread(target=add_items,args=(safe_list,))foriinrange(10)]=[Thread(target=add_items,args=(safe_list,))foriin range(10)]

# Tạo danh sách toàn chủ đề (Đang chờ)

Cuối cùng, khi kiểm tra kích thước của cấu trúc ở cuối chương trình, chúng ta có thể gọi hàm qsize () trên hàng đợi. chuỗi trongchuỗi.

    chủ đề. start()chuỗi. bắt đầu()

# Báo cáo số lượng mục trong danh sách

in (kích thước f'list. {an_list. qsize ()} ')('Main chờ chủ đề. ')

Cuối cùng, khi kiểm tra kích thước của cấu trúc ở cuối chương trình, chúng ta có thể gọi hàm qsize () trên hàng đợi. chuỗi trongchuỗi.

    chủ đề. tham gia()chuỗi. tham gia()

# Tạo danh sách toàn chủ đề (Đang chờ)

Cuối cùng, khi kiểm tra kích thước của cấu trúc ở cuối chương trình, chúng ta có thể gọi hàm qsize () trên hàng đợi. (f'Kích thước danh sách. {safe_list. qsize()}')

# Báo cáo số lượng mục trong danh sách

in (size f'list. {an_list. qsize ()} ')

Buộc lại với nhau, ví dụ hoàn chỉnh được liệt kê dưới đây

#Trăn Siêu Nhanh. com

# Ví dụ về danh sách toàn chủ đề thông qua hàng đợi

from input stream streamqueue. Hàng đợi không chặn khi thêm các mục – đó là phần lớn công việc được thực hiện bởi các luồng trong ví dụ này

từ queue hàng queue Main waiting forthreads . .. .

# Định cấu hình các luồng để thêm vào danh sáchkích thước. 1000000

# Bắt đầu chủ đề

chủ đề hướng tới chủ đề

# Chờ tất cả các luồng kết thúc

  • in ('Chờ các chủ đề chính. ')

Khởi động ví dụ đầu tiên để tạo ra một hàng chờ đợi

  • Sau đó chủ đề được cấu hình và bắt đầu. Mỗi chủ đề thêm 100. 000 queue into the clock time fast could

Chặn luồng chính cho đến khi các luồng công nhân chấm dứt

  • Cuối cùng, chặn chặn luồng chính và báo cáo kích thước của hàng đợi. cuốn sách của tôi. ).  
  • Trong trường hợp này, kích thước được báo cáo là 1. 000. 000 mặt hàng, như mong đợi
  • Hơn nữa, bạn sẽ thấy rằng ví dụ này nhanh hơn đáng kể để thực thi vì hàng đợi. hàng đợi không bị chặn khi thêm các mục - phần lớn công việc được thực hiện bởi các luồng trong ví dụ này

'Main Chờ đợi trước

  • Kích thước danh sách. 1000000
    • Đọc thêm
  • Phần này cung cấp các tài nguyên bổ sung mà bạn có thể thấy hữu ích
    • API
  • Chủ đề - song song based on stream
    • Hướng dẫn

mang đi

Bây giờ bạn đã biết cách sử dụng một danh sách toàn chủ đề trong Python

Bạn có câu hỏi nào không? .
Đặt câu hỏi của bạn trong phần bình luận bên dưới và tôi sẽ cố gắng hết sức để trả lời.

Ảnh của Harley-Davidson trên unsplash

Is list in the title python

Hầu hết các danh sách hoạt động là nguyên tử. Nhiều biến hoạt động phổ biến trong danh sách là nguyên tử, có nghĩa là chúng an toàn cho luồng. Nhiều thao tác phổ biến trong danh sách là nguyên tử, nghĩa là chúng an toàn cho luồng .

Là chủ đề danh sách

Tạo danh sách trống. Nó thực hiện giao diện danh sách. Nó là một biến có thể là chủ đề toàn bộ của ArrayList. Đại diện cho chung. Đây là biến thể an toàn cho luồng của ArrayList . T đại diện chung.

Là chủ đề pop list python

Các hoạt động pop () là nguyên tử, có nghĩa là chúng sẽ không bị gián đoạn bởi một luồng khác. Vì vậy, nếu bạn giới hạn bản thân chỉ sử dụng. append() and. pop(), thì bạn sẽ được toàn chủ đề. nếu bạn hạn chế chỉ sử dụng. chắp thêm() và. pop() , thì chuỗi của bạn sẽ an toàn .

Python có thực sự đa luồng không?

Python không hỗ trợ đa luồng vì Python trên trình thông dịch Cpython không hỗ trợ thực thi đa lõi thực sự thông qua đa luồng. Tuy nhiên, Python có một thư viện stream. Gil không chặn dòng