Gỡ lỗi đa xử lý trong Python


Câu trả lời:


6

Các chương trình Python đa xử lý thực sự (trái ngược với các chương trình Python đa luồng phải xử lý GIL đáng sợ ) không khác với các chương trình trong bất kỳ ngôn ngữ nào khác. Tất cả đều có những thách thức cơ bản giống nhau:

  1. Phân công nhiệm vụ và báo cáo kết quả. Ngay cả khi họ chủ yếu làm việc trên các bộ dữ liệu độc lập, họ thường phải quay lại luồng chính để báo cáo kết quả và nhận dữ liệu mới để làm việc. Đây có thể là một điểm nghẹt thở.
  2. Điều kiện chủng tộc. Các quy trình đang cố gắng sử dụng tài nguyên một lần và họ cần sử dụng mutex (hoặc một cái gì đó tương tự) để tránh bị dẫm đạp lên dữ liệu của nhau. Việc không bảo vệ các loại tài nguyên này có thể dẫn đến các phiên gỡ lỗi thực sự, thực sự đau đớn.
  3. Tính tuần tự. Đôi khi bạn đang cố gắng tạo ra một cái gì đó song song không. Các quy trình khác nhau cuối cùng chờ đợi nhau để làm một cái gì đó và kết quả cuối cùng là bạn, trong tất cả các ý định và mục đích, đã thực hiện một chương trình tuần tự, làm cho nó song song, và nó vẫn kết thúc thực hiện trong thời gian tuyến tính (hoặc tệ hơn).

Mặc dù có những phương pháp phát triển cố gắng tránh từng vấn đề này, vào cuối ngày bạn thực sự cần phải suy nghĩ về những gì bạn đang làm. Tôi khuyên bạn nên thử nghiệm căng thẳng nặng nề - vượt xa mọi thứ bạn nghĩ có thể xảy ra trong cuộc sống thực - để bạn có cơ hội đánh vào những Cơ hội đó và phát triển trái ngược với bản demo chính hoặc trong quá trình sản xuất.

Chúng tôi thường sử dụng các tệp nhật ký được đánh dấu thời gian microsecond và sau đó tạo ra một ứng dụng xem nhật ký được mã hóa màu để chúng tôi có thể cố gắng hình dung những gì đang xảy ra giữa quá trình N chạy trên bộ xử lý M. Chúng tôi cũng đã cố gắng (và chủ yếu là thành công) trong việc tạo ra một hệ thống giúp loại bỏ các tệp nhật ký để tạo lại bối cảnh của sự cố.

Nhưng công cụ tốt nhất là thiết kế tốt và những người thực sự độc ác, xấu xa, những người cố gắng thổi ứng dụng của bạn ra khỏi nước. (Xin chào, chuông!)


25

Một điều mà tôi thấy rất hữu ích, là sử dụng bộ ghi chép hiện có trong multiprocessingmô-đun. Hãy thử điều này trong mã chính của bạn:

import multiprocessing, logging
mpl = multiprocessing.log_to_stderr()
mpl.setLevel(logging.INFO)

Xem thêm: http://docs.python.org/l Library / multiprocessing.html#logging

Ngoài ra, bạn có thể truy cập tên quy trình hiện tại bằng cách sử dụng:

cpname = multiprocessing.current_process().name
# print cpname
mylogger.info("{0} is currently doing...".format(cpname))

Xem: http://docs.python.org/l Library / multiprocessing.html # multiprocessing.civerse_ process

Ngoài ra, tôi không biết bất cứ điều gì khác ngoại trừ các phương pháp sửa lỗi tiêu chuẩn như pdb& co.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.