Hướng dẫn python thread global variable - biến toàn cục chuỗi python

sẽ được trình biên dịch giải thích là assign to a => Create local variable a, đó không phải là những gì bạn muốn. Nó có thể sẽ thất bại với lỗi a not initialized vì (cục bộ) A thực sự chưa được khởi tạo:

Show

Toàn bộ lớp có thể trông như sau:

# Sửa đổi biến thể hiệncomplicated, and you cannot expect to have an intuitive understanding of the order in which events are happening when two (or more) threads work on the same value. The language, compiler, OS, processor... can ALL play a role, and decide to modify the order of operations for speed, practicality or any other reason.

Cách thích hợp cho loại điều này là sử dụng các công cụ chia sẻ Python (khóa và bạn bè), hoặc tốt hơn, giao tiếp dữ liệu thông qua hàng đợi thay vì chia sẻ nó, ví dụ: như thế này:

Các luồng sau đó có thể gọi các chức năng trên lớp và biết rằng trạng thái bên trong của lớp được bảo vệ. Nhận xét về lớp học sẽ cần phải tuyên bố rằng lớp an toàn cho luồng và những phương thức cố gắng có được khóa sẽ cần phải tuyên bố rằng chúng có thể chặn.

Đọc thêmdata variables shared between threads using a threading.Lock mutex lock, and you can share data between threads explicitly using queue.Queue.

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.

Chủ đề - song song dựa trên luồng

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

  • Bảng xác định API mô -đun chủ đề
  • Chủ đề câu hỏi phỏng vấn API
    • Khởi động nhảy luồng (khóa học 7 ngày của tôi)
    • Takeaways
    • Bây giờ bạn biết cách chia sẻ các biến dữ liệu giữa các luồng.
  • Bạn có câu hỏi nào không? Đặt câu hỏi của bạn trong các ý kiến ​​dưới đây và tôi sẽ cố gắng hết sức để trả lời.
    • Ảnh của Harley-Davidson trên unplash
    • Cập nhật lần cuối vào ngày 12 tháng 9 năm 2022
    • Bạn có thể bảo vệ các biến dữ liệu được chia sẻ giữa các luồng bằng cách sử dụng khóa Mutex và bạn có thể chia sẻ dữ liệu giữa các luồng bằng cách sử dụng hàng đợi.queue.
  • # Tạo khóa để bảo vệ thể hiện
  • # có được khóa

với self.lock:

# Sửa đổi biến thể hiện

Điều này gói gọn các biện pháp an toàn luồng cho biến thể hiện trong lớp.

Các luồng sau đó có thể gọi các chức năng trên lớp và biết rằng trạng thái bên trong của lớp được bảo vệ. Nhận xét về lớp học sẽ cần phải tuyên bố rằng lớp an toàn cho luồng và những phương thức cố gắng có được khóa sẽ cần phải tuyên bố rằng chúng có thể chặn.threading.Thread class.

Đọ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.

Chủ đề - song song dựa trên luồng

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

  • Bảng xác định API mô -đun chủ đề
  • Chủ đề câu hỏi phỏng vấn API
  • Khởi động nhảy luồng (khóa học 7 ngày của tôi)

Takeaways

Chúng tôi có thể cần chia sẻ dữ liệu vì nhiều lý do vì nhiều luồng cần đọc và/hoặc ghi vào cùng một biến dữ liệu.

Vấn đề với nhiều luồng đọc và viết cùng một biến là nó có thể dẫn đến chế độ thất bại đồng thời được gọi là điều kiện chủng tộc.

Bạn có thể tìm hiểu thêm về điều kiện cuộc đua ở đây:

  • Điều kiện cuộc đua với một biến được chia sẻ trong Python

Làm thế nào chúng ta có thể chia sẻ dữ liệu giữa các luồng một cách an toàn?

Có vòng lặp chậm? Chạy song song các vòng lặp của bạn (sử dụng tất cả CPU) Tìm hiểu cách tải xuống Sách điện tử miễn phí của tôi: Các vòng lặp song song trong Python Run your loops in parallel (using all CPUs)
Learn how by downloading my FREE ebook: Parallel Loops in Python

Có nhiều cách để chia sẻ dữ liệu giữa các luồng một cách an toàn.

Phương pháp cụ thể để sử dụng phụ thuộc vào loại dữ liệu cần chia sẻ.

Ba cách tiếp cận phổ biến bao gồm:

  • Chia sẻ một biến boolean với một luồng.Event.threading.Event.
  • Bảo vệ dữ liệu được chia sẻ với một luồng.lock.threading.Lock.
  • Chia sẻ dữ liệu với hàng đợi.queue.queue.Queue.

Hãy cùng nhau xem xét kỹ hơn từng cái.

Khi chia sẻ cờ Boolean, một sự kiện có thể được sử dụng thông qua lớp chuỗi.Event.thread.Event class.

Lớp sự kiện sẽ bảo vệ một biến Boolean đảm bảo tất cả truy cập và thay đổi thành biến là an toàn, tránh các điều kiện chủng tộc.

Sự kiện này có thể được tạo ở trạng thái Untet hoặc Sai.False state.

.....

# Tạo một sự kiện

event=threading.Event()=threading.Event()

Sau đó nó có thể được chia sẻ giữa các chủ đề.

Trạng thái của sự kiện có thể được kiểm tra một cách an toàn thông qua hàm is_set ().is_set() function.

Ví dụ:

.....

# Tạo một sự kiện

ifevent.is_set():event.is_set():

Sau đó nó có thể được chia sẻ giữa các chủ đề.

Trạng thái của sự kiện có thể được kiểm tra một cách an toàn thông qua hàm is_set ().True via the set() function and set False via the clear() function.

Ví dụ:

.....

# Tạo một sự kiện

event.set().set()

Sau đó nó có thể được chia sẻ giữa các chủ đề.

Trạng thái của sự kiện có thể được kiểm tra một cách an toàn thông qua hàm is_set ().

event.clear().clear()

Ví dụ:

  • # Kiểm tra xem sự kiện có được đặt không

# ...

Sự kiện giá trị có thể được thay đổi bởi nhiều luồng khác nhau. Nó có thể được đặt thành True thông qua hàm SET () và đặt sai thông qua hàm Cry ().threading.Lock class.

# Đặt sự kiện đúng

# Đặt sự kiện sai

Bạn có thể tìm hiểu thêm về sự kiện ở đây:acquire() and release() functions, for example:

.....

# Tạo một sự kiện

lock=threading.Lock()=threading.Lock()

.....

# Tạo một sự kiện

lock.acquire().acquire()

Sau đó nó có thể được chia sẻ giữa các chủ đề.

.....

# Tạo một sự kiện

lock.release().release()

Sau đó nó có thể được chia sẻ giữa các chủ đề.

Ví dụ:

.....

# Tạo một sự kiện

lock=threading.Lock()=threading.Lock()

.....

# Tạo một sự kiện

Sau đó nó có thể được chia sẻ giữa các chủ đề.lock:

Sau đó nó có thể được chia sẻ giữa các chủ đề.

.....

# Tạo một sự kiện

  • Sau đó nó có thể được chia sẻ giữa các chủ đề.

Trạng thái của sự kiện có thể được kiểm tra một cách an toàn thông qua hàm is_set ().queue.Queue class.

Ví dụ:

# Kiểm tra xem sự kiện có được đặt không

  • # ...: A fully-featured first-in-first-out (FIFO) queue.
  • Sự kiện giá trị có thể được thay đổi bởi nhiều luồng khác nhau. Nó có thể được đặt thành True thông qua hàm SET () và đặt sai thông qua hàm Cry ().: A FIFO queue with less functionality.
  • # Đặt sự kiện đúng: A last-in-first-out (LIFO) queue.
  • # Đặt sự kiện sai: A queue where the first items out are those with the highest priority.

Bạn có thể tìm hiểu thêm về sự kiện ở đây:

.....

# Tạo một sự kiện

queue=Queue()=Queue()

Sau đó nó có thể được chia sẻ giữa các chủ đề.

Trạng thái của sự kiện có thể được kiểm tra một cách an toàn thông qua hàm is_set ().put() function. We can put any Python object we like on the queue.

Ví dụ:

.....

# Tạo một sự kiện

foriinrange(100):iinrange(100):

Sau đó nó có thể được chia sẻ giữa các chủ đề.

queue.put(i).put(i)

Trạng thái của sự kiện có thể được kiểm tra một cách an toàn thông qua hàm is_set ().

Ví dụ:get() function. Once an item of data has been retrieved from the queue, it is removed. This means that only one thread can get each item on the queue.

Ví dụ:

.....

# Tạo một sự kiện

whileTrue:True:

Sau đó nó có thể được chia sẻ giữa các chủ đề.

data=queue.get()=queue.get()

Sau đó nó có thể được chia sẻ giữa các chủ đề.

Trạng thái của sự kiện có thể được kiểm tra một cách an toàn thông qua hàm is_set ().

Ví dụ:
Download my FREE PDF cheat sheet

# Kiểm tra xem sự kiện có được đặt không

Ví dụ:

  • # Kiểm tra xem sự kiện có được đặt không
  • # ...
  • Sự kiện giá trị có thể được thay đổi bởi nhiều luồng khác nhau. Nó có thể được đặt thành True thông qua hàm SET () và đặt sai thông qua hàm Cry ().

# Đặt sự kiện đúng

# Đặt sự kiện sai

Chúng tôi có thể chia sẻ một biến cục bộ giữa các luồng bằng cách sử dụng hàng đợi.

Hàng đợi phải được chia sẻ và truy cập vào từng luồng và trong hàm nơi biến cục bộ được xác định và sử dụng.

Ví dụ: trước tiên chúng ta có thể tạo một thể hiện hàng đợi.queue.Queue instance.

.....

# Tạo một hàng đợi

queue=queue.Queue()=queue.Queue()

Sau đó, chúng ta có thể chuyển hàng đợi đến chức năng của chúng ta như một đối số.

# chức năng tác vụ tùy chỉnh được thực hiện bởi một luồng

Def Task_Function (Hàng đợi):task_function(queue):

# ...

Trong chức năng của chúng tôi, chúng tôi có thể xác định biến cục bộ của chúng tôi và gán một số giá trị.

.....

# Tạo một hàng đợi

data=55=55

Sau đó, chúng ta có thể chuyển hàng đợi đến chức năng của chúng ta như một đối số.

# chức năng tác vụ tùy chỉnh được thực hiện bởi một luồng

.....

# Tạo một hàng đợi

queue.put(data).put(data)

Sau đó, chúng ta có thể chuyển hàng đợi đến chức năng của chúng ta như một đối số.

# chức năng tác vụ tùy chỉnh được thực hiện bởi một luồng

Def Task_Function (Hàng đợi):task_function(queue):

# Tạo một hàng đợi

data=55=55

# Tạo một hàng đợi

queue.put(data).put(data)

Sau đó, chúng ta có thể chuyển hàng đợi đến chức năng của chúng ta như một đối số.

# chức năng tác vụ tùy chỉnh được thực hiện bởi một luồng

Def Task_Function (Hàng đợi):another_task_function(queue):

# ...

Trong chức năng của chúng tôi, chúng tôi có thể xác định biến cục bộ của chúng tôi và gán một số giá trị.

# chức năng tác vụ tùy chỉnh được thực hiện bởi một luồng

.....

# Tạo một hàng đợi

data=queue.get()=queue.get()

Sau đó, chúng ta có thể chuyển hàng đợi đến chức năng của chúng ta như một đối số.

# chức năng tác vụ tùy chỉnh được thực hiện bởi một luồng

Def Task_Function (Hàng đợi):another_task_function(queue):

# Tạo một hàng đợi

data=queue.get()=queue.get()

Sau đó, chúng ta có thể chuyển hàng đợi đến chức năng của chúng ta như một đối số.

# chức năng tác vụ tùy chỉnh được thực hiện bởi một luồng

# chức năng tác vụ tùy chỉnh được thực hiện bởi một luồng

.....

Def Task_Function (Hàng đợi):

data=66=66

# ...

# chức năng tác vụ tùy chỉnh được thực hiện bởi một luồng

Def Task_Function (Hàng đợi):

# ...custom():

Trong chức năng của chúng tôi, chúng tôi có thể xác định biến cục bộ của chúng tôi và gán một số giá trị.

data=33=33

# Tạo một biến cục bộ

# chức năng tác vụ tùy chỉnh được thực hiện bởi một luồng

Def Task_Function (Hàng đợi):

# ...custom():

Trong chức năng của chúng tôi, chúng tôi có thể xác định biến cục bộ của chúng tôi và gán một số giá trị.

# Tạo một biến cục bộdata

Trong chức năng của chúng tôi, chúng tôi có thể xác định biến cục bộ của chúng tôi và gán một số giá trị.

data=33=33

# Tạo một biến cục bộ

Sau đó, chúng tôi có thể chia sẻ biến cục bộ của chúng tôi với một chủ đề khác bằng cách đặt nó vào hàng đợi.threading.Lock class.

Ví dụ:

# chức năng tác vụ tùy chỉnh được thực hiện bởi một luồng

.....

Def Task_Function (Hàng đợi):

data=66=66

# ...

lock=threading.Lock()=threading.Lock()

Trong chức năng của chúng tôi, chúng tôi có thể xác định biến cục bộ của chúng tôi và gán một số giá trị.

# Tạo một biến cục bộ

# chức năng tác vụ tùy chỉnh được thực hiện bởi một luồng

Def Task_Function (Hàng đợi):

# ...custom():

Trong chức năng của chúng tôi, chúng tôi có thể xác định biến cục bộ của chúng tôi và gán một số giá trị.

# Tạo một biến cục bộlock:

Trong chức năng của chúng tôi, chúng tôi có thể xác định biến cục bộ của chúng tôi và gán một số giá trị.

data=33=33

# Tạo một biến cục bộ

Sau đó, chúng tôi có thể chia sẻ biến cục bộ của chúng tôi với một chủ đề khác bằng cách đặt nó vào hàng đợi.

Ví dụ:

classCustomClass():CustomClass():

# Chia sẻ biến cục bộ

Chức năng có thể trông như sau:__init__(self):

Thể hiện hàng đợi sau đó có thể được chia sẻ với một chủ đề khác có thể thực thi một số chức năng khác.

self.data=33.data=33

# chức năng tác vụ tùy chỉnh được thực hiện bởi một luồng khác

# chức năng tác vụ tùy chỉnh được thực hiện bởi một luồng

Def Task_Function (Hàng đợi):

# ...task(self):

self.data=22.data=22

Trong chức năng của chúng tôi, chúng tôi có thể xác định biến cục bộ của chúng tôi và gán một số giá trị.

Ví dụ:

classCustomClass():CustomClass():

# Chia sẻ biến cục bộ

Chức năng có thể trông như sau:__init__(self):

Thể hiện hàng đợi sau đó có thể được chia sẻ với một chủ đề khác có thể thực thi một số chức năng khác.

self.data=33.data=33

Def Task_Function (Hàng đợi):

# ...task(self):

self.data=22.data=22

Trong chức năng của chúng tôi, chúng tôi có thể xác định biến cục bộ của chúng tôi và gán một số giá trị.

.....

# Tạo một biến cục bộ

custom=CustomClass()=CustomClass()

custom.task().task()

Sau đó, chúng tôi có thể chia sẻ biến cục bộ của chúng tôi với một chủ đề khác bằng cách đặt nó vào hàng đợi.

Ví dụ:

# chức năng tác vụ tùy chỉnh được thực hiện bởi một luồng

.....

# Tạo một biến cục bộ

custom=CustomClass()=CustomClass()

Sau đó, chúng tôi có thể chia sẻ biến cục bộ của chúng tôi với một chủ đề khác bằng cách đặt nó vào hàng đợi.

lock=threading.Lock()=threading.Lock()

.....

Ví dụ:

# Tạo một biến cục bộlock:

Sau đó, chúng tôi có thể chia sẻ biến cục bộ của chúng tôi với một chủ đề khác bằng cách đặt nó vào hàng đợi.

custom.task().task()

Ví dụ:

# Chia sẻ biến cục bộ

# chức năng tác vụ tùy chỉnh được thực hiện bởi một luồng

# Chia sẻ biến cục bộ

Chức năng có thể trông như sau:__init__(self):

Thể hiện hàng đợi sau đó có thể được chia sẻ với một chủ đề khác có thể thực thi một số chức năng khác.

self.data=33.data=33

# chức năng tác vụ tùy chỉnh được thực hiện bởi một luồng khác

self.lock=threading.Lock().lock =threading.Lock()

def khác_task_function (hàng đợi):

# Phương thức trên lớp

nhiệm vụ def (tự):task(self):

# có được khóa

với self.lock:self.lock:

# Sửa đổi biến thể hiện

self.data=22.data=22

Điều này gói gọn các biện pháp an toàn luồng cho biến thể hiện trong lớp.

Các luồng sau đó có thể gọi các chức năng trên lớp và biết rằng trạng thái bên trong của lớp được bảo vệ.Nhận xét về lớp học sẽ cần phải tuyên bố rằng lớp an toàn cho luồng và những phương thức cố gắng có được khóa sẽ cần phải tuyên bố rằng chúng có thể chặn.

Đọ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.

  • Chủ đề - song song dựa trên luồng
  • Chủ đề: Hướng dẫn hoàn chỉnh
  • Bảng xác định API mô -đun chủ đề
  • Chủ đề câu hỏi phỏng vấn API
  • Khởi động nhảy luồng (khóa học 7 ngày của tôi)

Takeaways

Bây giờ bạn biết cách chia sẻ các biến dữ liệu giữa các luồng.

Bạn có câu hỏi nào không? Đặt câu hỏi của bạn trong các ý kiến dưới đây và tôi sẽ cố gắng hết sức để trả lời.
Ask your questions in the comments below and I will do my best to answer.

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