Computer >> Máy Tính >  >> Lập trình >> Python

Đồng bộ hóa và tổng hợp các quy trình trong Python

Đồng bộ hóa giữa các quy trình

Multiprocessing là một gói hỗ trợ các quá trình sinh sản bằng cách sử dụng một API. Gói này được sử dụng cho cả đồng thời cục bộ và từ xa. Sử dụng mô-đun này, lập trình viên có thể sử dụng nhiều bộ xử lý trên một máy nhất định. Nó chạy trên hệ điều hành Windows và UNIX.

Tất cả các nguyên thủy đồng bộ hóa tương đương đều có trong gói này.

Mã mẫu

from multiprocessing import Process, Lock
   def my_function(x, y):
      x.acquire()
      print ('hello world', y)
      x.release()
      if __name__ == '__main__':
      lock = Lock()
   for num in range(10):
Process(target= my_function, args=(lock, num)).start()

Tại đây, một phiên bản có thể khóa để đảm bảo rằng chỉ một quy trình có thể hiển thị đầu ra tiêu chuẩn tại một thời điểm.

Tổng hợp

Để gộp chung, chúng tôi sử dụng lớp Pool. Khi người ta có thể tạo một nhóm các quy trình sẽ thực hiện toàn bộ nhiệm vụ được giao cho nó.

class multiprocessing.Pool([processes[, initializer[, initargs[, maxtasksperchild]]]])

Một đối tượng nhóm kiểm soát một nhóm nhân viên để chọn công việc nào có thể được gửi và nó hỗ trợ kết quả không đồng bộ có thời gian chờ, lệnh gọi lại và triển khai bản đồ song song.

cpu_count () được sử dụng nếu quá trình không có và bộ khởi tạo (* initargs) hàm này gọi khi bộ khởi tạo không phải là không có.

apply(func[, args[, kwds]])

Điều này cũng giống như hàm tích hợp apply (). Điều này bị chặn cho đến khi kết quả sẵn sàng, nếu nó muốn thực hiện song song thì phương thức apply_async () sẽ tốt hơn.

apply_async(func[, args[, kwds[, callback]]])

Trả về một đối tượng kết quả.

bản đồ (func, có thể lặp lại [, chunksize])

map () là một hàm dựng sẵn và nó chỉ hỗ trợ một đối số có thể lặp lại. Nó sẽ chặn cho đến khi kết quả sẵn sàng.

Trong phương pháp này, tệp có thể lặp lại được chia thành một số phần nhỏ và các phần nhỏ này được gửi đến nhóm quy trình như một nhiệm vụ riêng biệt.

map_async (func, iterable [, chunksize [, callback]])

Trả về một đối tượng kết quả.

imap (func, có thể lặp lại [, chunksize])

Nó giống như itertools.imap ().

Kích thước của đối số giống với kích thước được sử dụng trong map ().

imap_unordered (func, có thể lặp lại [, chunksize])

Điều này giống với imap () ngoại trừ việc trình lặp sửa lỗi phải được sắp xếp.

đóng ()

Khi một nhân viên đã hoàn thành tất cả các nhiệm vụ thì nhân viên đó sẽ thoát khỏi quy trình.

chấm dứt ()

Nếu chúng ta muốn dừng quá trình worker ngay lập tức mà không hoàn thành tác vụ thì phương pháp này được sử dụng.

tham gia ()

Trước khi sử dụng phương thức join (), chúng ta phải sử dụng các hàm close () và end ().

class multiprocessing.pool.AsyncResult

Được trả về bởi Pool.apply_async () và Pool.map_async ().

get ([timeout])

Hàm này trả về kết quả khi nó đến.

đợi ([thời gian chờ])

Sử dụng chức năng chờ này, chúng tôi đợi kết quả có sẵn hoặc cho đến khi thời gian chờ giây trôi qua.

sẵn sàng ()

Hàm này trả về việc cuộc gọi đã hoàn tất hay chưa.

thành công ()

Hàm này trả về khi cuộc gọi hoàn tất mà không có bất kỳ lỗi nào.

Mã mẫu

# -*- coding: utf-8 -*-
"""
Created on Sun Sep 30 12:17:58 2018
@author: Tutorials Point
"""
from multiprocessing import Pool
import time
def myfunction(m):
return m*m
if __name__ == '__main__':
my_pool = Pool(processes=4) # start 4 worker processes
result = my_pool.apply_async(myfunction, (10,)) # evaluate "f(10)" asynchronously in a single process
print (result.get(timeout=1))
print (my_pool.map(myfunction, range(10))) # prints "[0, 1, 4,..., 81]"
my_it = my_pool.imap(myfunction, range(10))
print (my_it.next() ) # prints "0"
print (my_it.next() ) # prints "1"
print (my_it.next(timeout=1) ) # prints "4" unless your computer is *very* slow
result = my_pool.apply_async(time.sleep, (10,))
print (result.get(timeout=1) ) # raises multiprocessing.TimeoutError