Việc thực thi không đồng bộ có thể được thực hiện với các luồng, sử dụng
import shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']05 hoặc các quy trình riêng biệt, sử dụng
import shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']06. Cả hai đều triển khai cùng một giao diện, được xác định bởi lớp trừu tượng
import shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']0
Tính khả dụng . không phải Emscripten, không phải WASI.
Mô-đun này không hoạt động hoặc không khả dụng trên nền tảng WebAssembly
import shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']1 và
import shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']2. Xem Nền tảng WebAssugging để biết thêm thông tin.
Đối tượng thực thi¶
lớp đồng thời. tương lai. Người thi hành ¶Một lớp trừu tượng cung cấp các phương thức để thực hiện các cuộc gọi không đồng bộ. Nó không nên được sử dụng trực tiếp mà thông qua các lớp con cụ thể của nó
gửi[fn , /, *args, **kwargs]¶
Lên lịch trình có thể gọi, fn, được thực thi dưới dạng
import shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']3 và trả về một đối tượngimport shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']4 đại diện cho việc thực thi có thể gọiwith ThreadPoolExecutor[max_workers=1] as executor: future = executor.submit[pow, 323, 1235] print[future.result[]]bản đồ[chức năng , *iterables, timeout=None, chunksize=1]¶Tương tự như
import shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']5 ngoại trừ
các lần lặp được thu thập ngay lập tức thay vì lười biếng;
func được thực thi không đồng bộ và một số cuộc gọi đến func có thể được thực hiện đồng thời
Trình lặp được trả về sẽ tăng một
import shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']6 nếuimport shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']7 được gọi và không có kết quả sau khi hết thời gian vài giây từ lệnh gọi ban đầu đếnimport shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']8. thời gian chờ có thể là int hoặc float. Nếu thời gian chờ không được chỉ định hoặcimport shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']9, không có giới hạn về thời gian chờ đợiNếu một lệnh gọi func phát sinh một ngoại lệ, thì ngoại lệ đó sẽ được phát sinh khi giá trị của nó được lấy từ trình vòng lặp
Khi sử dụng
import shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']06, phương pháp này cắt các lần lặp lại thành một số phần mà nó gửi tới nhóm dưới dạng các tác vụ riêng biệt. Kích thước [gần đúng] của các khối này có thể được chỉ định bằng cách đặt kích thước khối thành một số nguyên dương. Đối với các lần lặp rất dài, sử dụng giá trị lớn cho chunksize có thể cải thiện đáng kể hiệu suất so với kích thước mặc định là 1. Vớiimport shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']05, chunksize không có tác dụngĐã thay đổi trong phiên bản 3. 5. Đã thêm đối số chunksize.
tắt[chờ=Đúng, *, cancel_futures=False]¶Báo hiệu cho người thực thi rằng nó sẽ giải phóng bất kỳ tài nguyên nào mà nó đang sử dụng khi các hợp đồng tương lai đang chờ xử lý được thực thi xong. Các cuộc gọi đến
import shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']12 vàimport shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']8 được thực hiện sau khi tắt máy sẽ tăngimport shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']14Nếu thời gian chờ là
import shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']15 thì phương thức này sẽ không trả về cho đến khi tất cả các hợp đồng tương lai đang chờ xử lý được thực thi xong và các tài nguyên được liên kết với bộ thực thi đã được giải phóng. Nếu đợi làimport shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']16 thì phương thức này sẽ trả về ngay lập tức và các tài nguyên được liên kết với bộ thực thi sẽ được giải phóng khi tất cả các hợp đồng tương lai đang chờ xử lý được thực thi xong. Bất kể giá trị của sự chờ đợi là gì, toàn bộ chương trình Python sẽ không thoát cho đến khi tất cả các hợp đồng tương lai đang chờ xử lý được thực thi xongNếu cancel_futures là
import shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']15, phương pháp này sẽ hủy bỏ tất cả các hợp đồng tương lai đang chờ xử lý mà người thi hành chưa bắt đầu chạy. Bất kỳ hợp đồng tương lai nào đã hoàn thành hoặc đang chạy sẽ không bị hủy, bất kể giá trị của cancel_futures là bao nhiêuNếu cả cancel_futures và wait đều là
import shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']15, thì tất cả các futures mà executor đã bắt đầu chạy sẽ được hoàn thành trước khi phương thức này quay trở lại. Các hợp đồng tương lai còn lại bị hủy bỏBạn có thể tránh phải gọi phương thức này một cách rõ ràng nếu bạn sử dụng câu lệnh
import shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']19, câu lệnh này sẽ tắtimport shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']0 [chờ như thểimport shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']01 được gọi với thời gian chờ được đặt thànhimport shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']15]import shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']Đã thay đổi trong phiên bản 3. 9. Đã thêm hủy_tương lai.
ThreadPoolExecutor¶
import shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']05 là một lớp con
import shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']0 sử dụng một nhóm các luồng để thực hiện các cuộc gọi không đồng bộ
Bế tắc có thể xảy ra khi khả năng gọi được liên kết với một
import shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']4 chờ kết quả của một
import shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']4 khác. Ví dụ
import shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']1
Và
import shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']0lớp đồng thời. tương lai. ThreadPoolExecutor[max_workers=Không có, thread_name_prefix='', initializer=None, initargs=[]]¶
Một lớp con
import shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']0 sử dụng nhóm tối đa max_workers luồng để thực hiện lệnh gọi không đồng bộ
Tất cả các chủ đề được liệt kê vào
import shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']05 sẽ được nối trước khi trình thông dịch có thể thoát. Lưu ý rằng trình xử lý thoát thực hiện việc này được thực thi trước bất kỳ trình xử lý thoát nào được thêm bằng cách sử dụng
import shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']09. Điều này có nghĩa là các ngoại lệ trong luồng chính phải được bắt và xử lý để báo hiệu các luồng thoát ra một cách duyên dáng. Vì lý do này, không nên sử dụng
import shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']05 cho các tác vụ chạy dài
trình khởi tạo là một tùy chọn có thể gọi được gọi khi bắt đầu mỗi luồng công nhân; . Nếu trình khởi tạo đưa ra một ngoại lệ, thì tất cả các công việc đang chờ xử lý hiện tại sẽ tăng một
import shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']01, cũng như bất kỳ nỗ lực nào để gửi thêm công việc vào nhóm
Đã thay đổi trong phiên bản 3. 5. Nếu max_workers là
import shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']9 hoặc không được cung cấp, nó sẽ mặc định là số lượng bộ xử lý trên máy, nhân với
import shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']03, giả sử rằng
import shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']05 thường được sử dụng để chồng chéo I/O thay vì công việc của CPU và .
Mới trong phiên bản 3. 6. Đối số thread_name_prefix đã được thêm vào để cho phép người dùng kiểm soát tên
import shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']06 cho chuỗi công nhân do nhóm tạo để gỡ lỗi dễ dàng hơn.
Đã thay đổi trong phiên bản 3. 7. Đã thêm các đối số khởi tạo và khởi tạo.
Đã thay đổi trong phiên bản 3. 8. Giá trị mặc định của max_workers được đổi thành
import shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']07. Giá trị mặc định này duy trì ít nhất 5 worker cho các tác vụ ràng buộc I/O. Nó sử dụng tối đa 32 lõi CPU cho các tác vụ liên quan đến CPU giải phóng GIL. Và nó tránh sử dụng hoàn toàn các tài nguyên rất lớn trên các máy nhiều lõi.
ThreadPoolExecutor hiện sử dụng lại các chuỗi công nhân nhàn rỗi trước khi bắt đầu các chuỗi công nhân max_workers
Ví dụ về ThreadPoolExecutor¶
import shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']0
ProcessPoolExecutor¶
Lớp
import shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']06 là một lớp con
import shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']0 sử dụng một nhóm các quy trình để thực hiện các lệnh gọi không đồng bộ.
import shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']06 sử dụng mô-đun
import shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']71, cho phép nó vượt qua Khóa thông dịch viên toàn cầu nhưng cũng có nghĩa là chỉ các đối tượng có thể chọn mới có thể được thực thi và trả về.
Mô-đun
import shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']72 phải được nhập bởi các quy trình con worker. Điều này có nghĩa là
import shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']06 sẽ không hoạt động trong trình thông dịch tương tác
Gọi các phương thức
import shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']0 hoặc
import shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']4 từ một khả năng gọi được gửi tới một
import shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']06 sẽ dẫn đến bế tắclớp đồng thời. tương lai. ProcessPoolExecutor[max_workers=Không có, mp_context=None, initializer=None, initargs=[], max_tasks_per_child=None]¶
Một lớp con
import shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']0 thực thi các cuộc gọi không đồng bộ bằng cách sử dụng nhóm tối đa các quy trình max_workers. Nếu max_workers là
import shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']9 hoặc không được cung cấp thì nó sẽ mặc định là số lượng bộ xử lý trên máy. Nếu max_workers nhỏ hơn hoặc bằng
import shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']79 thì sẽ tăng
import shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']180. Trên Windows, max_workers phải nhỏ hơn hoặc bằng
import shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']181. Nếu không thì
import shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']180 sẽ được nâng lên. Nếu max_workers là
import shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']9, thì mặc định được chọn tối đa là
import shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']181, ngay cả khi có nhiều bộ xử lý hơn. mp_context có thể là ngữ cảnh đa xử lý hoặc Không. Nó sẽ được sử dụng để khởi động công nhân. Nếu mp_context là
import shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']9 hoặc không được cung cấp, ngữ cảnh đa xử lý mặc định sẽ được sử dụng
trình khởi tạo là một tùy chọn có thể gọi được gọi khi bắt đầu mỗi quy trình worker; . Nếu bộ khởi tạo đưa ra một ngoại lệ, thì tất cả các công việc đang chờ xử lý sẽ tăng một
import shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']186, cũng như bất kỳ nỗ lực nào để gửi thêm công việc vào nhóm
max_tasks_per_child là một đối số tùy chọn chỉ định số lượng tác vụ tối đa mà một quy trình có thể thực thi trước khi thoát và được thay thế bằng một quy trình worker mới. Theo mặc định, max_tasks_per_child là
import shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']9, điều đó có nghĩa là worker process sẽ tồn tại miễn là nhóm. Khi giá trị tối đa được chỉ định, phương thức bắt đầu đa xử lý "sinh sản" sẽ được sử dụng theo mặc định khi không có tham số mp_context. Tính năng này không tương thích với phương thức khởi động “rẽ nhánh”
Đã thay đổi trong phiên bản 3. 3. Khi một trong các quy trình công nhân chấm dứt đột ngột, lỗi
import shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']186 sẽ xuất hiện. Trước đây, hành vi không được xác định nhưng các hoạt động trên bộ thực thi hoặc tương lai của nó thường bị đóng băng hoặc bế tắc.
Đã thay đổi trong phiên bản 3. 7. Đối số mp_context đã được thêm vào để cho phép người dùng kiểm soát start_method cho các quy trình worker được tạo bởi nhóm.
Đã thêm các đối số trình khởi tạo và khởi tạo
Đã thay đổi trong phiên bản 3. 11. Đối số max_tasks_per_child đã được thêm vào để cho phép người dùng kiểm soát thời gian tồn tại của công nhân trong nhóm.
ProcessPoolExecutor Ví dụ¶
import shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']7
Đối tượng tương lai¶
Lớp
import shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']4 gói gọn việc thực thi không đồng bộ của một hàm có thể gọi được. Phiên bản
import shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']4 được tạo bởi
import shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']12lớp đồng thời. tương lai. Tương lai ¶
Đóng gói việc thực thi không đồng bộ của một callable. Phiên bản
import shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']4 được tạo bởi
import shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']12 và không được tạo trực tiếp ngoại trừ để thử nghiệm
hủy[] ¶
Cố gắng hủy cuộc gọi. Nếu cuộc gọi hiện đang được thực hiện hoặc chạy xong và không thể bị hủy thì phương thức sẽ trả về
import shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']16, nếu không cuộc gọi sẽ bị hủy và phương thức sẽ trả vềimport shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']15đã hủy[] ¶Quay lại
import shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']15 nếu cuộc gọi đã bị hủy thành côngđang chạy[] ¶Trả về
import shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']15 nếu cuộc gọi hiện đang được thực hiện và không thể hủy bỏxong[] ¶Quay lại
import shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']15 nếu cuộc gọi bị hủy thành công hoặc chạy xongkết quả[thời gian chờ=Không có]¶Trả về giá trị được trả về bởi cuộc gọi. Nếu cuộc gọi chưa hoàn thành thì phương thức này sẽ đợi đến hết giây. Nếu cuộc gọi chưa hoàn thành trong vài giây hết thời gian chờ, thì một
import shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']6 sẽ được nâng lên. thời gian chờ có thể là int hoặc float. Nếu thời gian chờ không được chỉ định hoặcimport shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']9, không có giới hạn về thời gian chờ đợiNếu tương lai bị hủy trước khi hoàn thành thì
import shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']051 sẽ tăngNếu cuộc gọi đưa ra một ngoại lệ, phương pháp này sẽ đưa ra cùng một ngoại lệ
ngoại lệ[thời gian chờ=Không có]¶Trả lại ngoại lệ được đưa ra bởi cuộc gọi. Nếu cuộc gọi chưa hoàn thành thì phương thức này sẽ đợi đến hết giây. Nếu cuộc gọi chưa hoàn thành trong vài giây hết thời gian chờ, thì một
import shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']6 sẽ được nâng lên. thời gian chờ có thể là int hoặc float. Nếu thời gian chờ không được chỉ định hoặcimport shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']9, không có giới hạn về thời gian chờ đợiNếu tương lai bị hủy trước khi hoàn thành thì
import shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']051 sẽ tăngNếu cuộc gọi hoàn thành mà không tăng,
import shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']9 được trả vềadd_done_callback[fn] ¶Đính kèm fn có thể gọi được vào tương lai. fn sẽ được gọi, với tương lai là đối số duy nhất của nó, khi tương lai bị hủy hoặc chạy xong
Các khả năng gọi được đã thêm được gọi theo thứ tự mà chúng đã được thêm vào và luôn được gọi trong một luồng thuộc quy trình đã thêm chúng. Nếu khả năng gọi được tăng một lớp con
import shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']056, nó sẽ được ghi lại và bỏ qua. Nếu khả năng gọi tăng một lớp conimport shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']057, thì hành vi không được xác địnhNếu tương lai đã hoàn thành hoặc bị hủy, fn sẽ được gọi ngay lập tức
Các phương pháp
import shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']4 sau đây được sử dụng trong các bài kiểm tra đơn vị và triển khai
import shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']0
set_running_or_notify_cancel[] ¶
Phương pháp này chỉ nên được gọi bằng cách triển khai
import shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']0 trước khi thực hiện công việc liên quan đếnimport shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']4 và bằng các bài kiểm tra đơn vịNếu phương thức trả về
import shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']16 thìimport shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']4 đã bị hủy, tôi. e.import shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']064 đã được gọi và trả vềimport shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']15. Bất kỳ chủ đề nào đang chờ hoàn thànhimport shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']4 [i. e. đếnimport shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']067 hoặcimport shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']068] sẽ được đánh thứcNếu phương thức trả về
import shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']15 thìimport shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']4 không bị hủy và đã được đặt ở trạng thái đang chạy, tôi. e. các cuộc gọi đếnimport shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']01 sẽ trả vềimport shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']15Phương thức này chỉ có thể được gọi một lần và không thể được gọi sau khi
import shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']03 hoặcimport shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']04 đã được gọiset_result[kết quả] ¶Đặt kết quả của công việc được liên kết với
import shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']4 thành kết quảPhương pháp này chỉ nên được sử dụng bởi
import shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']0 triển khai và kiểm tra đơn vịĐã thay đổi trong phiên bản 3. 8. Phương pháp này tăng
import shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']07 nếuimport shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']4 đã được thực hiện. set_Exception[ngoại lệ] ¶Đặt kết quả của công việc được liên kết với
import shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']4 thành ngoại lệimport shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']056Phương pháp này chỉ nên được sử dụng bởi
import shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']0 triển khai và kiểm tra đơn vịĐã thay đổi trong phiên bản 3. 8. Phương pháp này tăng
import shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']07 nếuimport shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']4 đã được thực hiện.
Chức năng mô-đun¶
đồng thời. tương lai. chờ đã[fs , hết thời gian=None, return_when=ALL_COMPLETED]¶Đợi các phiên bản
import shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']4 [có thể được tạo bởi các phiên bản
import shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']0 khác] do fs cung cấp để hoàn thành. Các hợp đồng tương lai trùng lặp được cung cấp cho fs sẽ bị xóa và sẽ chỉ được trả lại một lần. Trả về 2 bộ đã đặt tên. Bộ đầu tiên, có tên là
import shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']16, chứa các hợp đồng tương lai đã hoàn thành [hợp đồng tương lai đã hoàn thành hoặc bị hủy] trước khi quá trình chờ đợi hoàn tất. Bộ thứ hai, có tên là
import shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']17, chứa các hợp đồng tương lai chưa hoàn thành [hợp đồng tương lai đang chờ xử lý hoặc đang hoạt động]
thời gian chờ có thể được sử dụng để kiểm soát số giây tối đa phải đợi trước khi quay lại. thời gian chờ có thể là int hoặc float. Nếu thời gian chờ không được chỉ định hoặc
import shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']9, không có giới hạn về thời gian chờ đợi
return_when cho biết khi nào hàm này sẽ trả về. Nó phải là một trong những hằng số sau
Không thay đổi
Sự mô tả
import shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']19
Hàm sẽ trả về khi bất kỳ tương lai nào kết thúc hoặc bị hủy
import shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']20
Hàm sẽ trả về khi bất kỳ tương lai nào kết thúc bằng cách đưa ra một ngoại lệ. Nếu không có tương lai nào phát sinh ngoại lệ thì nó tương đương với
import shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']21
import shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']21
Chức năng sẽ trở lại khi tất cả các hợp đồng tương lai kết thúc hoặc bị hủy bỏ
đồng thời. tương lai. as_completed[fs , hết thời gian chờ=None]¶Trả về một trình vòng lặp trên các phiên bản
import shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']4 [có thể được tạo bởi các phiên bản
import shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']0 khác nhau] được cung cấp bởi fs mang lại các hợp đồng tương lai khi chúng hoàn thành [tương lai đã hoàn thành hoặc bị hủy bỏ]. Bất kỳ hợp đồng tương lai nào được đưa ra bởi fs bị trùng lặp sẽ được trả lại một lần. Bất kỳ hợp đồng tương lai nào hoàn thành trước khi
import shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']067 được gọi sẽ được tính trước. Trình lặp được trả về sẽ tăng một
import shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']6 nếu
import shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']7 được gọi và không có kết quả sau khi hết thời gian vài giây từ lệnh gọi ban đầu đến
import shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']067. thời gian chờ có thể là int hoặc float. Nếu thời gian chờ không được chỉ định hoặc
import shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']9, không có giới hạn về thời gian chờ đợi
Xem thêm
PEP 3148 – tương lai - thực hiện tính toán không đồng bộĐề xuất mô tả tính năng này để đưa vào thư viện chuẩn Python
Các lớp ngoại lệ¶
ngoại lệ đồng thời. tương lai. Lỗi bị hủy ¶Tăng lên khi một tương lai bị hủy bỏ
ngoại lệ đồng thời. tương lai. Lỗi hết giờ ¶Bí danh không dùng nữa của
import shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']6, được nâng lên khi một hoạt động trong tương lai vượt quá thời gian chờ nhất định
Đã thay đổi trong phiên bản 3. 11. Lớp này có bí danh là
import shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']6. ngoại lệ đồng thời. tương lai. Người thực thi bị hỏng ¶
Bắt nguồn từ
import shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']14, lớp ngoại lệ này được đưa ra khi một bộ thực thi bị hỏng vì một lý do nào đó và không thể được sử dụng để gửi hoặc thực thi các tác vụ mới
Mới trong phiên bản 3. 7
ngoại lệ đồng thời. tương lai. InvalidStateError ¶Xảy ra khi một thao tác được thực hiện trên một tương lai không được phép ở trạng thái hiện tại
Mới trong phiên bản 3. 8
ngoại lệ đồng thời. tương lai. chủ đề. BrokenThreadPool ¶Bắt nguồn từ
import shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']33, lớp ngoại lệ này được đưa ra khi một trong các công nhân của
import shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']05 khởi tạo không thành công
Mới trong phiên bản 3. 7
ngoại lệ đồng thời. tương lai. quá trình. BrokenProcessPool ¶Bắt nguồn từ
import shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']33 [trước đây là
import shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']14], loại ngoại lệ này được nâng lên khi một trong những công nhân của
import shutil with ThreadPoolExecutor[max_workers=4] as e: e.submit[shutil.copy, 'src1.txt', 'dest1.txt'] e.submit[shutil.copy, 'src2.txt', 'dest2.txt'] e.submit[shutil.copy, 'src3.txt', 'dest3.txt'] e.submit[shutil.copy, 'src4.txt', 'dest4.txt']06 đã chấm dứt hợp đồng theo cách không trong sạch [ví dụ: nếu nó bị giết từ bên ngoài]