2017-09-13 12 views
8

Để tăng tốc độ cho chương trình python của tôi, tôi có nên tạo ra một luồng riêng biệt hoặc một quy trình riêng để ghi nhật ký không? Chương trình của tôi sử dụng rất nhiều đăng nhập và tôi không chắc liệu luồng có phù hợp vì GIL hay không. Rất nhiều tài nguyên dường như cho thấy rằng nó sẽ là tốt cho I/O. Tôi nghĩ rằng đăng nhập là I/O nhưng tôi không chắc chắn những gì "nên được tốt" có nghĩa là đối với hầu hết các nguồn lực ra khỏi đó. Tôi chỉ cần tốc độ.Để tăng tốc độ cho chương trình python của tôi, tôi có nên tạo ra một luồng riêng biệt hoặc một quy trình riêng để ghi nhật ký không?

+1

Điều gì khiến bạn tin rằng việc ghi nhật ký là nút cổ chai? Nếu bạn chưa làm như vậy, bạn sẽ muốn lập hồ sơ chương trình của mình để xem phần lớn thời gian chờ xảy ra ở đâu. – MrName

+0

@MrName Tôi chỉ muốn loại bỏ mọi mili giây đơn lẻ mà tôi có thể loại bỏ. Mã của tôi phải chạy 10 triệu lần và mỗi mili giây đếm. Hoặc bạn đang đề xuất 10m * 200 = 2b dòng đăng nhập không quan trọng đến mức đó? – user2675516

+0

Tôi giả định rằng chi phí hiệu suất của các cuộc gọi đăng nhập của bạn sẽ phụ thuộc nhiều vào các trình xử lý ghi nhật ký. Luồng MIGHT giúp đỡ, nhưng nó có thể tốt hơn để chạy các loại điều này trong các tác vụ nền, do đó thời gian thực hiện của cuộc gọi đăng nhập không còn bị ràng buộc với thời gian thực thi ứng dụng của bạn. – MrName

Trả lời

8

Trước khi bạn bắt đầu cố gắng tối ưu hóa một chương trình, có một số việc bạn nên làm.

Để bắt đầu, bạn nên tiểu sử các chương trình của mình. Bạn có thể ví dụ: sử dụng line_profiler.

Nếu nó chỉ ra rằng phần mềm của bạn dành một số lượng đáng kể thời gian đăng nhập, có hai lựa chọn dễ dàng.

  • Đặt loglevel trong mã sản xuất để không có hoặc ít (er) thư được ghi lại. Vẫn còn một số chi phí bên trái, nhưng nó sẽ giảm nhiều.
  • Sử dụng phương tiện cơ học (như sed hoặc grep) để hoàn toàn xóa cuộc gọi ghi nhật ký từ mã sản xuất. Nếu điều này không cải thiện tốc độ/thông lượng của chương trình của bạn, việc ghi nhật ký không phải là vấn đề.

Nếu không ai trong số đó phù hợp và ghi nhật ký là một phần đáng kể thời gian của chương trình, bạn có thể thử triển khai ghi nhật ký luồng hoặc quy trình.

Nếu bạn muốn sử dụng threading để đăng nhập, bạn sẽ cần một danh sách và một khóa. Hàm được gọi từ luồng chính để ghi nhật ký lấy khóa, gắn thêm văn bản để đăng nhập vào danh sách và nhả khóa. Chủ đề thứ hai chờ khóa, lấy khóa, bật một vài mục từ danh sách, nhả khóa và ghi các mục vào một tập tin. Vì GIL đảm bảo rằng chỉ có một luồng tại một thời điểm đang chạy mã byte bytecode của Python, điều này sẽ làm giảm hiệu suất của chương trình của bạn một chút; một phần thời gian của nó được dùng để chạy bytecode từ luồng ghi.

Sử dụng multiprocessing hơi khác một chút, bạn có thể muốn sử dụng ví dụ: a Queue để gửi thông điệp ghi nhật ký từ quá trình chính đến quá trình ghi nhật ký. Quá trình đăng nhập lấy các mục từ Queue và ghi chúng vào đĩa. Điều này có nghĩa là thời gian viết hành động ghi vào đĩa được chi tiêu trong một chương trình khác. Nhưng có một số chi phí liên quan đến việc sử dụng Hàng đợi.

Bạn sẽ phải đo để xem phương pháp nào sử dụng ít thời gian hơn trong chương trình của bạn.

0

Tôi sẽ bởi những giả định:

  • Bạn đã xác định rằng nó là khai thác gỗ của bạn cũng được bottlenecking chương trình của bạn.
  • Bạn có lý do chính đáng tại sao bạn ghi nhật ký những gì bạn đang ghi nhật ký.

Tốc độ chậm được cho là rất có thể do xác nhận thành công hay thất bại từ hành động ghi nhật ký. Để tránh điều này "lệnh xếp hàng" làm cho các cuộc gọi đến một quá trình riêng biệt asynchonously và bỏ qua gọi lại. Điều này có thể sẽ tiêu tốn nhiều tài nguyên hơn, nhưng điều này sẽ làm giảm bớt tồn đọng trong chương trình chính của bạn. Nodejs xử lý tự nhiên này hoặc bạn có thể cuộn trình nghe python của riêng bạn. Vì đây sẽ là một quá trình riêng biệt. Bạn có thể chuyển hướng tính năng ghi nhật ký của các chương trình khác của bạn đến chương trình này. Bạn thậm chí có thể có một máy riêng để xử lý khối lượng công việc này.

Các vấn đề liên quan