Hướng dẫn chunksize pool python - trăn hồ bơi cỡ lớn

Bạn có thể thực hiện các tác vụ theo các lô bằng cách sử dụng đối số của Chunksize khi sử dụng phương thức Pool Map ().chunksize” argument when using the Pool map() method.

Trong hướng dẫn này, bạn sẽ khám phá ra đối số Chunksize khi thực hiện nhiều nhiệm vụ với nhóm đa xử lý trong Python.chunksize argument when executing multiple tasks with the multiprocessing pool in Python.

Bắt đầu nào.

  • Vấn đề với việc ban hành nhiều nhiệm vụ cho nhóm
  • Chunksize là gì
  • Chức năng nào hỗ trợ phân chia
  • Chunksize mặc định là gì?
  • Cách định cấu hình Chunksize
  • Ví dụ không có chunking (chunksize = 1)
  • Ví dụ với Chunksize mặc định (Chunksize = none)
  • Ví dụ với chundksize (chunksize = n_tasks/n_workers)
  • Phần mở rộng
  • Đọc thêm
  • Takeaways

Vấn đề với việc ban hành nhiều nhiệm vụ cho nhóm

Chunksize là gì

Chức năng nào hỗ trợ phân chiaPool.map() to apply the same function to each item in an iterable and wait for the results, or with a function like Pool.map_async() that does the same thing asynchronously.

Chunksize mặc định là gì?

Specifically:

  • Cách định cấu hình Chunksize
  • Ví dụ không có chunking (chunksize = 1)
  • Ví dụ với Chunksize mặc định (Chunksize = none)
  • Ví dụ với chundksize (chunksize = n_tasks/n_workers)

Phần mở rộng

Đọc thêm

Takeaways

Nhóm đa xử lý cho phép chúng tôi phát hành nhiều nhiệm vụ cho nhóm quy trình cùng một lúc.chunksize” argument when issuing tasks.

Chunksize là gì

Chức năng nào hỗ trợ phân chiachunksize” is an argument specified in a function to the multiprocessing pool when issuing many tasks.

Chunksize mặc định là gì?

Cách định cấu hình Chunksize

Ví dụ không có chunking (chunksize = 1)

Ví dụ với Chunksize mặc định (Chunksize = none)

  • Ví dụ với chundksize (chunksize = n_tasks/n_workers)
  • Phần mở rộng
  • Đọc thêm

Takeaways

Nhóm đa xử lý cho phép chúng tôi phát hành nhiều nhiệm vụ cho nhóm quy trình cùng một lúc.
Download my FREE PDF cheat sheet

Chức năng nào hỗ trợ phân chia

Chunksize mặc định là gì?chunksize” argument when issuing multiple tasks.

Cách định cấu hình Chunksize

  • Pool.map()
  • Pool.map_async()
  • Pool.imap()
  • Pool.imap_unordered()
  • Pool.starmap()
  • Pool.starmap_async()

Ví dụ không có chunking (chunksize = 1)

  • Ví dụ với Chunksize mặc định (Chunksize = none)


Ví dụ với chundksize (chunksize = n_tasks/n_workers)

Phần mở rộng

Đọc thêm

Takeaways
 


Chunksize mặc định là gì?

Cách định cấu hình Chunksizechunksize” has the default value of None.

Ví dụ không có chunking (chunksize = 1)Pool.imap() and Pool.imap_unordered(), the default chunksize is 1.

Ví dụ với Chunksize mặc định (Chunksize = none)

Ví dụ không có chunking (chunksize = 1)

Ví dụ với Chunksize mặc định (Chunksize = none)Pool.map(), Pool.starmap() and the asynchronous versions of these functions, the default is not 1.

Ví dụ với chundksize (chunksize = n_tasks/n_workers)None, a default chunksize is calculated based on the length of the provided iterable.

Phần mở rộngmultiprocessing.Pool class.

Đọc thêmPool class where the default chunksize is calculated.

Takeaways..

Nhóm đa xử lý cho phép chúng tôi phát hành nhiều nhiệm vụ cho nhóm quy trình cùng một lúc.chunksize isNone:

    chunksize,extra=divmod(len(iterable),len(self._pool)*4)chunksize,extra=divmod(len(iterable), len(self._pool)*4)

    ifextra:ifextra:

        chunksize+=1chunksize+=1

Tính toán liên quan đến việc chia số lượng các mục trong ITBER (ví dụ: số lượng nhiệm vụ được cấp) cho số lượng quy trình con công nhân nhân với bốn.

Nếu có một phần còn lại, thì một người được thêm vào phần mềm, để làm tròn cho các nhiệm vụ bổ sung.

Bạn có thể nhớ lại rằng hàm divmod () tích hợp sẽ trả về kết quả chia một số cho một số khác (thương số) cũng như phần còn lại.divmod() function will return the result of dividing one number by another (quotient) as well as the remainder.

Chúng ta có thể chứng minh tính toán này với một ví dụ nhỏ.

Hãy xem xét một nhóm đa xử lý với 2 quy trình nhân viên trẻ em và cuộc gọi đến MAP () với một mục có thể có 500.200 mục.

Các đoạn trong tình huống này sẽ được tính toán như sau:

  • Chunksize, Extra = DivMod (Len (Itable), Len (self._pool) * 4)
  • Chunksize, Extra = DivMod (500.000, 2 * 4)
  • Chunksize, Extra = Divmod (500.000, 8)
  • Chunksize, thêm = 62500, 0

Chúng ta có thể định cấu hình giá trị chunksize tùy chỉnh.

Chúng ta phải giả định rằng tính toán được sử dụng cho Chunksize mặc định đã được triển khai vì nó hoạt động tốt trong hầu hết các tình huống.

Điều này có nghĩa là bất kỳ khối tùy chỉnh nào chúng tôi đặt nên được so sánh với mặc định để đảm bảo nó cải thiện hiệu suất.

Trên thực tế, không có hướng dẫn chung nào về cách đặt ra đối số của Chunksize.chunksize” argument.

Thay vào đó, tôi khuyên bạn nên sử dụng một số thử nghiệm và lỗi để khám phá những gì hoạt động tốt cho các ứng dụng cụ thể của bạn.

Một số giá trị để khám phá có thể là:

  • Không có Chunksize: Chunksize = 1: chunksize=1
  • Mặc định: chunksize=None (default chunksize)
  • Ngay cả Chunksize: Chunksize = Len (Itable) / Len (Pool._Pool): chunksize = len(iterable) / len(pool._pool)

Ngoài ra, bạn có thể thử một thang đo nhật ký (đơn đặt hàng có độ lớn) giữa 1 và số lượng vật phẩm trong điều kiện được cung cấp để giúp nhanh chóng loại bỏ một giá trị hoạt động tốt.

Ví dụ:

  • chunksize=1
  • chunksize=10
  • chunksize=100
  • chunksize=1000
  • chunksize=10000
  • và như thế…

Bây giờ chúng tôi đã quen thuộc với Chunksize, hãy để Lôi nhìn vào một số ví dụ đã làm việc.

Ví dụ không có chunking (chunksize = 1)

Chúng ta có thể khám phá hiệu ứng của một phần của một.

Trong ví dụ này, chúng tôi sẽ xác định một nhiệm vụ đơn giản có một đối số, chặn trong giây lát để mô phỏng công việc và trả về một giá trị. Sau đó, chúng ta có thể đưa ra nhiều cuộc gọi đến chức năng này với các đối số khác nhau và đặt một đoạn của một và xem xét ví dụ mất bao lâu để thực hiện. Điều này sẽ cung cấp một điểm so sánh với các giá trị khác nhau sau này.

Đầu tiên, chúng ta có thể xác định một chức năng để thực thi trên nhóm đa xử lý.

Hàm sẽ lấy một đối số số nguyên, sẽ tạo ra một giá trị ngẫu nhiên trong khoảng từ 0 đến 1, chặn trong từ 1 đến 2 giây, sau đó trả về giá trị được tạo thêm cho đối số được cung cấp.

Hàm nhiệm vụ () bên dưới thực hiện điều này.task() function below implements this.

# Nhiệm vụ thực thi trong một quy trình riêng biệt

nhiệm vụ def (arg):task(arg):

& nbsp; & nbsp; & nbsp; & nbsp;# tạo một giá trị# generate a value

    value=random()value=random()

& nbsp; & nbsp; & nbsp; & nbsp;# khối cho một phần nhỏ của một giây# block for a fraction of a second

    sleep(1+value)sleep(1 +value)

& nbsp; & nbsp; & nbsp; & nbsp;# return giá trị được tạo kết hợp với đối số# return generated value combined with argument

    returnarg+valuereturnarg+value

Tiếp theo, trong quy trình chính sẽ tạo ra một nhóm đa xử lý bằng cách sử dụng cấu hình mặc định của tất cả các CPU logic trong hệ thống.

Bạn có thể tìm hiểu thêm về cấu hình mặc định của nhóm đa xử lý trong hướng dẫn:

  • Cách định cấu hình nhóm đa xử lý trong Python

Chúng tôi sẽ sử dụng giao diện Trình quản lý ngữ cảnh để đảm bảo nhóm được đóng tự động cho chúng tôi sau khi chúng tôi hoàn thành.

.....

# Tạo nhóm đa xử lý

với pool () aspool:Pool()aspool:

# ...

Bạn có thể tìm hiểu thêm về giao diện Trình quản lý ngữ cảnh cho nhóm trong hướng dẫn:

  • Trình quản lý bối cảnh nhóm đa xử lý

Tiếp theo, chúng tôi sẽ phát hành 100 cuộc gọi cho hàm T dụng cụ tùy chỉnh () của chúng tôi với các giá trị số nguyên từ 0 đến 99.task() function with integer values between 0 and 99.

Chúng tôi sẽ sử dụng hàm Bản đồ đồng bộ () để ban hành các tác vụ và theo số 1 và lặp lại các giá trị trả về sau khi tất cả các tác vụ đã hoàn thành.

.....

# Tạo nhóm đa xử lý

với pool () aspool:result inpool.map(task,range(100),chunksize=1):

# ...# report the result

    print(result)print(result)

Bạn có thể tìm hiểu thêm về giao diện Trình quản lý ngữ cảnh cho nhóm trong hướng dẫn:Pool.map() function in the tutorial:

  • Trình quản lý bối cảnh nhóm đa xử lý

Tiếp theo, chúng tôi sẽ phát hành 100 cuộc gọi cho hàm T dụng cụ tùy chỉnh () của chúng tôi với các giá trị số nguyên từ 0 đến 99.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

Chúng tôi sẽ sử dụng hàm Bản đồ đồng bộ () để ban hành các tác vụ và theo số 1 và lặp lại các giá trị trả về sau khi tất cả các tác vụ đã hoàn thành.

# Phát hành các nhiệm vụ và kết quả xử lý

forresult inpool.map (nhiệm vụ, phạm vi (100), chunksize = 1):time import sleep

& nbsp; & nbsp; & nbsp; & nbsp;# báo cáo kết quảrandom import random

Bạn có thể tìm hiểu thêm về hàm pool.map () trong hướng dẫn:multiprocessing import Pool

# Nhiệm vụ thực thi trong một quy trình riêng biệt

nhiệm vụ def (arg):task(arg):

& nbsp; & nbsp; & nbsp; & nbsp;# tạo một giá trị# generate a value

    value=random()value=random()

& nbsp; & nbsp; & nbsp; & nbsp;# khối cho một phần nhỏ của một giây# block for a fraction of a second

    sleep(1+value)sleep(1 +value)

& nbsp; & nbsp; & nbsp; & nbsp;# return giá trị được tạo kết hợp với đối số# return generated value combined with argument

    returnarg+valuereturnarg+value

# Bảo vệ điểm vào

if__name__=='__main__':__name__=='__main__':

& nbsp; & nbsp; & nbsp; & nbsp;# tạo nhóm đa xử lý# create the multiprocessing pool

& nbsp; & nbsp; & nbsp; & nbsp; với pool () aspool:with Pool()aspool:

& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & NBSP;# issue tasks and process results

& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp;forresult inpool.map(task,range(100),chunksize=1):

& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp;# report the result

            print(result)print(result)

Chạy ví dụ đầu tiên tạo ra nhóm đa xử lý với cấu hình mặc định.

Tiếp theo, 100 nhiệm vụ được cấp cho nhóm đa xử lý với số lượng 1.

Các nhiệm vụ được cấp cho người lao động cùng một lúc, được thực hiện và kết quả đã được trả lại.

Không có hàng loạt nhiệm vụ ban hành cho các nhiệm vụ nội bộ được gửi cho công nhân được thực hiện.

Tất cả các tác vụ được hoàn thành, sau đó các giá trị hoàn trả được trả lại cho người gọi và đi qua, báo cáo tất cả các giá trị.

Một ví dụ cắt ngắn của đầu ra được cung cấp dưới đây. Lưu ý, kết quả sẽ khác nhau mỗi khi ví dụ được chạy vì sử dụng các số ngẫu nhiên.

Trong trường hợp này, ví dụ mất khoảng 19,9 giây để hoàn thành trên hệ thống của tôi.

...

90.00666396577743

91.78748090488585

92.54642553173721

93.89105290250727

94.1142948528356

95.32983425821804

96.57469861761551

97.04100646174298

98.55079918540376

99.46373262845606

Tiếp theo, hãy để Lừa xem xét một ví dụ về việc sử dụng Chkksize mặc định.

Ví dụ với Chunksize mặc định (Chunksize = none)

Chúng ta có thể khám phá bằng cách sử dụng các đoạn mặc định được sử dụng bởi map (), starmap () và các phiên bản không đồng bộ của chúng.map(), starmap() and their asynchronous versions.

Trong ví dụ này, chúng tôi có thể cập nhật ví dụ trước để đặt đối số của Chunksize thành không có đối số nào, giống như bỏ qua hoàn toàn đối số Chunksize.chunksize” argument to None, the same as omitting the chunksize argument completely.

Ví dụ:

.....

Tiếp theo, hãy để Lừa xem xét một ví dụ về việc sử dụng Chkksize mặc định.

Ví dụ với Chunksize mặc định (Chunksize = none)result inpool.map(task,range(100),chunksize=None):

Chúng ta có thể khám phá bằng cách sử dụng các đoạn mặc định được sử dụng bởi map (), starmap () và các phiên bản không đồng bộ của chúng.# report the result

    print(result)print(result)

Trong ví dụ này, chúng tôi có thể cập nhật ví dụ trước để đặt đối số của Chunksize thành không có đối số nào, giống như bỏ qua hoàn toàn đối số Chunksize.

Ví dụ:

  • # Phát hành các nhiệm vụ và kết quả xử lý
  • forresult inpool.map (nhiệm vụ, phạm vi (100), chunksize = none):
  • & nbsp; & nbsp; & nbsp; & nbsp;# báo cáo kết quả
  • Điều này sẽ làm cho nhóm đa xử lý tính toán và sử dụng một đoạn mặc định.

Tôi có 8 CPU logic trong hệ thống của mình, do đó 8 nhân viên trẻ em theo mặc định. Do đó, trên hệ thống của tôi, các trò chơi mặc định trong trường hợp này sẽ được tính là:

  • Chunksize, Extra = DivMod (Len (Itable), Len (self._pool) * 4)
  • Chunksize, Extra = DivMod (100, 8 * 4)

Chunksize, Extra = DivMod (100, 32)

Chunksize, thêm = 3, 4

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

Cho rằng có một phần còn lại, 1 được thêm vào phần mềm để đưa ra:

Chunksize = 3 + 1

Chunksize = 4time import sleep

Điều đó có nghĩa là 100 nhiệm vụ được ban hành sẽ được ánh xạ tới 25 nhiệm vụ nội bộ.random import random

Tying này lại với nhau, ví dụ hoàn chỉnh được liệt kê dưới đây.multiprocessing import Pool

# SuperfastPython.com

# ví dụ với số lượng mặc địnhtask(arg):

từ thời gian nhập vào giấc ngủ# generate a value

    value=random()value=random()

từ nhập ngẫu nhiên ngẫu nhiên# block for a fraction of a second

    sleep(1+value)sleep(1 +value)

& nbsp; & nbsp; & nbsp; & nbsp;# return giá trị được tạo kết hợp với đối số# return generated value combined with argument

    returnarg+valuereturnarg+value

# Bảo vệ điểm vào

if__name__=='__main__':__name__=='__main__':

& nbsp; & nbsp; & nbsp; & nbsp;# tạo nhóm đa xử lý# create the multiprocessing pool

& nbsp; & nbsp; & nbsp; & nbsp; với pool () aspool:with Pool()aspool:

& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & NBSP;# issue tasks and process results

& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp;forresult inpool.map(task,range(100),chunksize=None):

& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp;# report the result

            print(result)print(result)

Chạy ví dụ đầu tiên tạo ra nhóm đa xử lý với cấu hình mặc định.

Tiếp theo, 100 nhiệm vụ được cấp cho nhóm đa xử lý với số lượng 1.

Các nhiệm vụ được cấp cho người lao động cùng một lúc, được thực hiện và kết quả đã được trả lại.

Tất cả các tác vụ được hoàn thành, sau đó các giá trị hoàn trả được trả lại cho người gọi và đi qua, báo cáo tất cả các giá trị.

Một ví dụ cắt ngắn của đầu ra được cung cấp dưới đây. Lưu ý, kết quả sẽ khác nhau mỗi khi ví dụ được chạy vì sử dụng các số ngẫu nhiên.

Trong trường hợp này, ví dụ mất khoảng 19,9 giây để hoàn thành trên hệ thống của tôi.

...

...

90.72061963275682

91.51395925172658

92.44189834307795

93.1294542451108

94.7868929918878

95.19862834343039

96.07772741723383

97.69995047391141

98.31798025450472

99.62925679159557

Tiếp theo, hãy để Lừa xem xét một ví dụ về việc sử dụng Chkksize mặc định.

Ví dụ với chundksize (chunksize = n_tasks/n_workers)

Chúng ta có thể khám phá hiệu quả của việc sử dụng một phần chay chẵn, đó là sự phân chia thậm chí số lượng nhiệm vụ cho các quy trình của công nhân trẻ em.

Trong trường hợp này, chúng tôi có thể cập nhật ví dụ trước để tính toán một phần mềm dựa trên số lượng các mục trong ITEBELBER và số lượng quy trình nhân viên trẻ em trong nhóm.

.....

# Số lượng nhiệm vụ để thực thi

n_tasks=100=100

# chunksize để sử dụng

n_tasks_per_chunk=ceil(n_tasks/len(pool._pool))=ceil(n_tasks/ len(pool._pool))

Hãy nhớ lại rằng hàm math.ceil () làm tròn một số điểm nổi lên đến số nguyên tiếp theo.math.ceil() function rounds a floating point number up to the next integer.

Trên hệ thống của tôi, tôi có 8 CPU logic, do đó 8 nhân viên trẻ em theo mặc định.

Do đó, thậm chí các trò hề trong trường hợp này sẽ là:

  • n_tasks_per_chunk = ceil (n_tasks / len (pool._pool)))
  • N_TASKS_PER_CHUNK = CEIL (100/8)
  • N_TASKS_PER_CHUNK = CEIL (12.5)
  • N_TASKS_PER_CHUNK = 13

Sau đó chúng tôi sẽ báo cáo các giá trị là xác nhận.

.....

# chunksize để sử dụng

n_tasks_per_chunk=ceil(n_tasks/len(pool._pool))=ceil(n_tasks/len(pool._pool))

Hãy nhớ lại rằng hàm math.ceil () làm tròn một số điểm nổi lên đến số nguyên tiếp theo.

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

Trên hệ thống của tôi, tôi có 8 CPU logic, do đó 8 nhân viên trẻ em theo mặc định.

Do đó, thậm chí các trò hề trong trường hợp này sẽ là:

n_tasks_per_chunk = ceil (n_tasks / len (pool._pool)))math import ceil

N_TASKS_PER_CHUNK = CEIL (100/8)time import sleep

N_TASKS_PER_CHUNK = CEIL (12.5)random import random

N_TASKS_PER_CHUNK = 13multiprocessing import Pool

Sau đó chúng tôi sẽ báo cáo các giá trị là xác nhận.

Tying này lại với nhau, ví dụ hoàn chỉnh được liệt kê dưới đây.task(arg):

# SuperfastPython.com# generate a value

    value=random()value=random()

# Ví dụ với các phần chay chẵn# block for a fraction of a second

    sleep(1+value)sleep(1 +value)

từ trần nhập khẩu toán học# return generated value combined with argument

    returnarg+valuereturnarg+value

từ thời gian nhập vào giấc ngủ

if__name__=='__main__':__name__=='__main__':

từ nhập ngẫu nhiên ngẫu nhiên# create the multiprocessing pool

từ nhóm nhập khẩu đa xử lýwith Pool()aspool:

# Nhiệm vụ thực thi trong một quy trình riêng biệt# number of tasks to execute

        n_tasks=100n_tasks= 100

nhiệm vụ def (arg):# chunksize to use

        n_tasks_per_chunk=ceil(n_tasks/len(pool._pool))n_tasks_per_chunk=ceil(n_tasks/len(pool._pool))

& nbsp; & nbsp; & nbsp; & nbsp;# tạo một giá trị# report details for reference

& nbsp; & nbsp; & nbsp; & nbsp;# khối cho một phần nhỏ của một giâyprint(f'chunksize={n_tasks_per_chunk}, n_workers={len(pool._pool)}')

& nbsp; & nbsp; & nbsp; & nbsp;# return giá trị được tạo kết hợp với đối số# issue tasks and process results

# Bảo vệ điểm vàoforresult in pool.map(task,range(100),chunksize=n_tasks_per_chunk):

& nbsp; & nbsp; & nbsp; & nbsp;# tạo nhóm đa xử lý# report the result

            print(result)print(result)

& nbsp; & nbsp; & nbsp; & nbsp; với pool () aspool:

& NBSP; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp;

& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & NBSP;

& nbsp; & nbsp;

& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp;

& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & NBSP;

& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp;

...

90.9139613348572

91.29627702972807

92.44633424109573

93.71585909166346

94.27121635373051

95.05300459383739

96.76344007460122

97.70486914449164

98.74067104900065

99.05785271152739

& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp;

Chạy ví dụ đầu tiên tạo ra nhóm đa xử lý với cấu hình mặc định.

  • Tiếp theo, 100 nhiệm vụ được cấp cho nhóm đa xử lý với số lượng được chỉ định là 13.
  • Các nhiệm vụ được cấp cho công nhân theo lô 13, được thực hiện và kết quả đã được trả lại.
  • Tất cả các tác vụ được hoàn thành, sau đó các giá trị hoàn trả được trả lại cho người gọi và đi qua, báo cáo tất cả các giá trị.imap() function.

Một ví dụ cắt ngắn của đầu ra được cung cấp dưới đây. Lưu ý, kết quả sẽ khác nhau mỗi khi ví dụ được chạy vì sử dụng các số ngẫu nhiên.

Trong trường hợp này, ví dụ này mất khoảng 20,3 giây để hoàn thành trên hệ thống của tôi, vẫn còn tệ hơn là sử dụng số lượng 1, mặc dù tốt hơn một chút so với phần mặc định trong trường hợp này.

Chunksize = 13, n_workers = 8

  • Phần mở rộng
  • Phần này cung cấp cho bạn một số ý tưởng để khám phá để tìm hiểu thêm về Chkksize.
  • Phát triển một ví dụ đưa ra nhiều nhiệm vụ hơn, ví dụ: 100.000 và thử các phần khác nhau theo thang điểm nhật ký từ 1 đến 100.000. Vẽ kết quả.
  • Phát triển một ví dụ trong đó có hai loại nhiệm vụ, nhiệm vụ thời gian ngắn và các tác vụ thời gian dài (2 lần trở lên trong thời gian ngắn), sau đó thử nghiệm với các kích thước chunk khác nhau.
  • Phát triển một ví dụ mà các thí nghiệm với chức năng IMAP ().

Nếu bạn khám phá bất kỳ ví dụ nào trong số này, hãy cho tôi biết. Tôi rất thích xem những gì bạn nghĩ ra.

Đọ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.
Ask your questions in the comments below and I will do my best to answer.

Ảnh của Austin Neill trên unplash