Tôi muốn ngăn chặn nhiều phiên bản của tập lệnh dòng lệnh python chạy dài cùng lúc chạy cùng một lúc và tôi muốn cá thể mới có thể gửi dữ liệu đến phiên bản gốc trước phiên bản mới tử tự. Làm thế nào tôi có thể làm điều này một cách đa nền tảng?có thể là một tập lệnh python biết rằng một thể hiện khác của cùng một tập lệnh đang chạy ... và sau đó nói chuyện với nó?
Cụ thể, tôi muốn để cho phép các hành vi sau đây:
- "
foo.py
" được khởi động từ dòng lệnh, và nó sẽ ở lại chạy trong một ngày time-- dài hoặc vài tuần cho đến khi máy đang khởi động lại hoặc quá trình cha mẹ giết chết nó. - cứ sau vài phút cùng một tập lệnh được khởi chạy lại, nhưng với các tham số dòng lệnh khác nhau
- khi khởi chạy, tập lệnh sẽ xem có bất kỳ phiên bản nào khác đang chạy hay không.
- nếu các phiên bản khác đang chạy, sau đó, cá thể số 2 sẽ gửi các tham số dòng lệnh của nó tới ví dụ # 1 và sau đó phiên bản # 2 sẽ thoát.
- Ví dụ # 1, nếu nó nhận các tham số dòng lệnh từ tập lệnh khác, nên xoay vòng một chuỗi mới và (sử dụng các tham số dòng lệnh được gửi ở bước trên) bắt đầu thực hiện tác vụ mà ví dụ # 2 sẽ thực hiện .
Vì vậy, tôi đang tìm hai điều: làm thế nào một chương trình python biết một thể hiện khác đang chạy, và sau đó làm thế nào một chương trình dòng lệnh có thể giao tiếp với nhau?
Làm việc này phức tạp hơn, cùng một tập lệnh cần chạy trên cả Windows và Linux, vì vậy lý tưởng giải pháp sẽ chỉ sử dụng thư viện chuẩn của Python chứ không phải bất kỳ cuộc gọi cụ thể cho hệ điều hành nào. Mặc dù nếu tôi cần phải có một codepath Windows và một codepath * nix (và một tuyên bố lớn if
trong mã của tôi để chọn một hoặc khác), đó là OK nếu một "cùng một mã" giải pháp là không thể.
Tôi nhận ra mình có thể làm việc theo cách tiếp cận dựa trên tệp (ví dụ: # 1 xem thư mục để thay đổi và mỗi trường hợp thả tệp vào thư mục đó khi muốn làm việc) nhưng tôi hơi lo ngại về dọn dẹp các tệp đó sau khi tắt máy không duyên dáng. Tôi lý tưởng có thể sử dụng một giải pháp trong bộ nhớ. Nhưng một lần nữa tôi linh hoạt, nếu một phương pháp tiếp cận dựa trên tập tin liên tục là cách duy nhất để làm điều đó, tôi sẽ mở ra tùy chọn đó.
Thông tin chi tiết: Tôi đang cố gắng thực hiện điều này vì máy chủ của chúng tôi đang sử dụng công cụ giám sát hỗ trợ chạy tập lệnh python để thu thập dữ liệu giám sát (ví dụ: kết quả truy vấn cơ sở dữ liệu hoặc cuộc gọi dịch vụ web). sau đó sử dụng. Một số kịch bản này rất tốn kém để khởi động nhưng rẻ để chạy sau khi khởi động (ví dụ: tạo kết nối DB và chạy truy vấn). Vì vậy, chúng tôi đã chọn để giữ cho chúng chạy trong một vòng lặp vô hạn cho đến khi quá trình cha mẹ giết chúng.
Điều này làm việc tuyệt vời, nhưng trên các máy chủ lớn hơn 100 phiên bản của cùng một tập lệnh có thể đang chạy, ngay cả khi chúng chỉ thu thập dữ liệu sau mỗi 20 phút. Điều này tàn phá với RAM, giới hạn kết nối DB, vv Chúng tôi muốn chuyển từ 100 tiến trình với 1 chuỗi thành một tiến trình với 100 luồng, mỗi luồng thực thi công việc mà trước đó, một tập lệnh đang thực hiện.
Nhưng việc thay đổi cách các tập lệnh được gọi bởi công cụ giám sát là không thể. Chúng ta cần giữ lời gọi tương tự (khởi chạy một tiến trình với các tham số dòng lệnh khác nhau) nhưng thay đổi các kịch bản để nhận ra rằng một kịch bản khác đang hoạt động, và có kịch bản lệnh mới gửi các chỉ lệnh công việc của nó (từ các tham số dòng lệnh) thành tập lệnh "cũ".
BTW, đây không phải là điều tôi muốn thực hiện trên cơ sở một tập lệnh. Thay vào đó, tôi muốn đóng gói hành vi này vào một thư viện mà nhiều tác giả kịch bản có thể tận dụng-- mục tiêu của tôi là cho phép các tác giả kịch bản viết các kịch bản đơn luồng đơn giản, không biết các vấn đề đa cá thể và xử lý đa luồng và duy nhất-instancing dưới bìa.
Tại sao bạn gắn bó với tập lệnh công nhân giống với tập lệnh gọi lệnh? Kịch bản công nhân có thể là một tiến trình máy chủ nhận các lệnh, được gửi bởi các máy khách chuyển tiếp lệnh, được khung theo dõi của bạn gọi, chỉ có một nhiệm vụ: báo cho máy chủ biết phải làm gì. – Bernd