Có nhiều ví dụ về cách thực hiện những việc sau:Giao tiếp chương trình trong python trên Linux
1) Giao tiếp giữa các quá trình khác nhau trong cùng một chương trình.
2) Giao tiếp giữa client/server thông qua mạng
Tuy nhiên, câu hỏi này không có ví dụ điển hình bất cứ nơi nào tôi đã xem xét:
- là gì một cách kinh điển để gửi một chuỗi từ trăn chương trình A đến chương trình B, mà khối và xử lý chuỗi này và sau đó chờ đợi cho nhau trong một vòng lặp?
Tôi cảm thấy như tôi đã đến gần câu trả lời nhiều lần, nhưng chưa bao giờ quản lý để tạo một ví dụ làm việc.
yêu cầu ngụ ý khác:
- Thực ra hai chương trình khác nhau: ví dụ cần phải thực sự có hai chương trình khác nhau (tức là hai tập tin progA.py, progB.py mà có thể chạy riêng biệt từ dòng lệnh trong hai màn hình trên cùng một máy), không sử dụng bất kỳ loại forking hoặc multiprocess nào để tạo máy khách và máy chủ.
- Vui lòng đề xuất cách thực hiện điều này cho phép các chuỗi có giới hạn độ dài thay đổi có thời lượng hợp lý được gửi, thay vì phải nhận số byte chính xác của kích thước dữ liệu chính xác. (Sau này là nhiều hơn nữa dễ bị lỗi trong thực hiện).
- Lý tưởng nhất là làm điều này mà không cần sử dụng kết nối Internet cục bộ
Ví dụ; khi người đọc sử dụng:
pipein = open(pipe_name, 'r')
while program.KeepRunning:
action = pipein.readline()[:-1]
program.processLine(line)
time.sleep(1)
và nhà văn sử dụng:
command = "enable"
pipeout = os.open(pipe_name, os.O_WRONLY)
os.write(pipeout, command)
os.write(pipeout, "\n")
như được đề nghị tại http://www.python-course.eu/pipes.php người đọc bị mắc kẹt trong một vòng lặp vô hạn cách đọc to các chuỗi rỗng.
Điều thú vị là thêm if(action == 'enable'): longFunction()
vào các kết quả chức năng program.processLine
trong một phần của mã trong longFunction
được thực thi trước khi bị kẹt đọc ra dòng trống mãi mãi.
Mặt khác, tất cả các ví dụ sử dụng mô đun subprocess
mức thấp hơn hiện đại hơn chỉ liên quan đến các ứng dụng đa luồng chứ không phải nhiều ứng dụng. Triển khai khác liên quan đến ổ cắm và mạng.
Trong khi tôi đã thử sử dụng ổ cắm, điều này dẫn đến lỗi chung 'đã xảy ra lỗi' với nhiều nguyên nhân có thể xảy ra Error 111: “connection refused”
hiển thị 'một số thời gian'. Là một phần của mã python được thực hiện khi nhận được một số lệnh thực sự thay đổi cấu hình mạng (ví dụ: nó gọi các lệnh như ip
, tc
và iptables
với các đối số khác nhau) sử dụng kết nối mạng tới localhost
là điều có thể tránh được. để gỡ lỗi và các vấn đề thường khó chịu. Bên cạnh phần không cần thiết khi chương trình thứ hai chạy trên cùng một máy, vì vậy bất kỳ liên lạc chương trình liên thông nào cũng không cần phải sử dụng các giao diện mạng.
bạn đã thử [multiprocessing.Queue] (https://pymotw.com/2/multiprocessing/communication.html) – Pynchia