Hướng dẫn can python threads access global variable? - luồng python có thể truy cập biến toàn cục không?
Trong một chức năng: Show
sẽ được trình biên dịch giải thích là
Bạn có thể nhận được những gì bạn muốn với (rất cau mày và vì lý do chính đáng)
Tuy nhiên, nói chung, bạn nên tránh sử dụng các biến toàn cầu trở nên cực kỳ nhanh chóng. Và điều này đặc biệt đúng đối với các chương trình đa luồng, nơi bạn không có bất kỳ cơ chế đồng bộ hóa nào cho 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: # Bảo vệ thể hiện đối tượngdata variables shared between threads using a threading.Lock mutex lock, and you can share data between threads explicitly using queue.Queue. Trong hướng dẫn này, bạn sẽ khám phá cách chia sẻ dữ liệu giữa các luồng một cách an toàn. Bắt đầu nào.
Cần chia sẻ dữ liệu giữa các luồngCách chia sẻ dữ liệu giữa các luồng Chia sẻ một biến Boolean với một sự kiện Truy cập dữ liệu được chia sẻ với khóa Chia sẻ dữ liệu với hàng đợithreading.Thread class. Cách chia sẻ các biến ở các phạm vi khác nhau
Chia sẻ các biến toàn cầu Chia sẻ các biến thể hiệ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 tôi để thực thi 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. Bạn có thể tìm hiểu thêm về các chủ đề Python trong hướng dẫn:
Trong lập trình đồng thời, chúng ta có thể cần chia sẻ dữ liệu giữa các luồng. Dữ liệu có thể đề cập đến nhiều thứ khác nhau, chẳng hạn như: Biến toàn cầu. Các biến cục bộ.
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. Chia sẻ một biến Boolean với một sự kiệnTruy cập dữ liệu được chia sẻ với khóathread.Event class. Chia sẻ dữ liệu với hàng đợi Cách chia sẻ các biến ở các phạm vi khác nhauFalse state.
Chia sẻ các biến thể hiện Đọc thêmis_set() function. Takeaways
Đọc thêmTrue via the set() function and set False via the clear() function. Takeaways
Takeaways
Truy cập dữ liệu được chia sẻ với khóaMỗ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.threading.Lock class. Đô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 tôi để thực thi 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. Bạn có thể tìm hiểu thêm về các chủ đề Python trong hướng dẫn:acquire() and release() functions, for example:
Chia sẻ các biến thể hiện Takeaways
Chia sẻ các biến toàn cầu
Chia sẻ dữ liệu với hàng đợiĐọc thêmqueue.Queue class. Takeaways Một chủ đề là một chủ đề thực thi trong một chương trình máy tính.
Một hàng đợi có thể được tạo sau đó được chia sẻ giữa nhiều luồng.
Sau khi được chia sẻ, chúng tôi có thể định cấu hình một hoặc nhiều luồng để thêm dữ liệu vào hàng đợi. Điều này có thể đạt được thông qua hàm put (). Chúng ta có thể đặt bất kỳ đối tượng Python nào chúng ta thích trên hàng đợi.put() function. We can put any Python object we like on the queue. Ví dụ:
Điều này có thể đạt được thông qua hàm put (). Chúng ta có thể đặt bất kỳ đối tượng Python nào chúng ta thích trên hàng đợi. 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ụ:
Điều này có thể đạt được bằng cách sử dụng hàm get (). Khi một mục dữ liệu đã được lấy từ hàng đợi, nó sẽ bị xóa. Điều này có nghĩa là chỉ một chủ đề có thể nhận được mỗi mục trên hàng đợi. # Vòng lặp mãi mãi # Nhận một mục dữ liệu từ hàng đợi# ... Ví dụ:
Điều này có thể đạt được bằng cách sử dụng hàm get (). Khi một mục dữ liệu đã được lấy từ hàng đợi, nó sẽ bị xóa. Điều này có nghĩa là chỉ một chủ đề có thể nhận được mỗi mục trên hàng đợi. # Vòng lặp mãi mãi# Nhận một mục dữ liệu từ hàng đợi # ... Bây giờ chúng ta đã biết cách chia sẻ các biến, hãy để xem xét việc chia sẻ các biến ở các phạm vi khác nhau. Bị nhầm lẫn bởi API mô -đun luồng? Tải xuống bảng cheat pdf miễn phí của tôiqueue.Queue instance.
Cách chia sẻ các biến ở các phạm vi khác nhau
Điều này có thể đạt được bằng cách sử dụng hàm get (). Khi một mục dữ liệu đã được lấy từ hàng đợi, nó sẽ bị xóa. Điều này có nghĩa là chỉ một chủ đề có thể nhận được mỗi mục trên hàng đợi.
# Nhận một mục dữ liệu từ hàng đợi Ví dụ:
# Thêm mục dữ liệu vào hàng đợi
# Thêm mục dữ liệu vào hàng đợi
Điều này có thể đạt được bằng cách sử dụng hàm get (). Khi một mục dữ liệu đã được lấy từ hàng đợi, nó sẽ bị xóa. Điều này có nghĩa là chỉ một chủ đề có thể nhận được mỗi mục trên hàng đợi. Ví dụ:
# Nhận một mục dữ liệu từ hàng đợi
# Nhận một mục dữ liệu từ hàng đợi # ...Bây giờ chúng ta đã biết cách chia sẻ các biến, hãy để xem xét việc chia sẻ các biến ở các phạm vi khác nhau. Ví dụ:
Cách chia sẻ các biến ở các phạm vi khác nhau Ví dụ:
Các biến thể hiện được xác định trong một lớp. Ví dụ:
Các biến thể hiện được xác định trong một lớp. Hãy cùng nhau xem lần lượt xem.threading.Lock class. Chia sẻ các biến cục bộ Ví dụ:
Chúng ta có thể cần chia sẻ các biến được xác định ở các phạm vi khác nhau. Các biến cục bộ trong một hàm. Ví dụ:
Các biến thể hiện được xác định trong một lớp.Hãy cùng nhau xem lần lượt xem. Chia sẻ các biến cục bộ
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ố. Ví dụ:
Toàn bộ lớp có thể trông như sau:
Chúng tôi có thể tạo một thể hiện của lớp và nhiều luồng có thể truy cập lớp, chẳng hạn như gọi các phương thức trên lớp truy cập hoặc sửa đổi biến thể hiện.
Mỗi luồng truy cập các phương thức trên đối tượng được chia sẻ có thể sửa đổi biến thể hiện, dẫn đến các điều kiện chủng tộc. Một cách để ngăn chặn một cuộc đua với các biến thể hiện trong phiên bản đối tượng là đảm bảo rằng tất cả các quyền truy cập vào đối tượng được chia sẻ được bảo vệ bởi khóa mutex. Ví dụ:
Ví dụ: # Tạo khóa để bảo vệ thể hiện Ví dụ:
nhiệm vụ def (tự):
Mỗi luồng truy cập các phương thức trên đối tượng được chia sẻ có thể sửa đổi biến thể hiện, dẫn đến các điều kiện chủng tộc. Một cách để ngăn chặn một cuộc đua với các biến thể hiện trong phiên bản đối tượng là đảm bảo rằng tất cả các quyền truy cập vào đối tượng được chia sẻ được bảo vệ bởi khóa mutex. Ví dụ: # Tạo khóa để bảo vệ thể hiện # Bảo vệ thể hiện đối tượng với khóa: # Tương tác với đối tượng chia sẻMột cách tiếp cận khác là bảo vệ biến thể hiện trong chính lớp.
# 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. Khóa học luồng python miễn phí |