开发一个基本的命令行实用程序来控制另一个进程[关闭]

Posted

技术标签:

【中文标题】开发一个基本的命令行实用程序来控制另一个进程[关闭]【英文标题】:Developing a basic command line utility to control another process [closed] 【发布时间】:2021-04-04 09:57:57 【问题描述】:

我正在尝试使用多处理和客户端服务器架构在 Python 中开发一个简单的应用程序。

我正在尝试实现一个在后台执行其操作的进程,以及另一个将连接到它并控制其行为的脚本。例如,告诉它暂停正在做的事情,或者完全做其他事情,或者完全停止。

实现此功能的可能方式/架构是什么?例如,我可以用python创建一个进程,然后再创建另一个脚本,通过它的PID获取对它的引用并进行通信吗?

【问题讨论】:

【参考方案1】:

服务器.py

from threading import Thread
import socket
import pickle

server_configuration = 
    "status": "start",
    "delay": 1
  # Server Configuration

def server():
    address = ("localhost", 4000)
    server_socket = socket.socket()  # Create a network object
    server_socket.bind(address)  # Start server on the address
    server_socket.listen(5)  # start accepting requests and allow maximum 5 requests in the request buffer
    while True:
        connection, client_address = server_socket.accept()  # Accept a connection
        request = connection.recv(10000)  # recv maximum 10 KB of requested data
        request = pickle.loads(request)  # load the request
        
        # Check the request
        if request["type"] = "stop":
            server_configuration["status"] = "stop"
        elif request["type"] = "start":
            server_configuration["status"] = "start"
        elif request["type"] = "set_delay":
            server_configuration["delay"] = request["time"]
        connection.close()


def background_task():  # You can do any task here
    from time import sleep
    count = 0  
    while True:
        if server_configuration["status"] == "start":
            print(count)
            count += 1
            time.sleep(server_configuration["delay"])


if __name__ == "__main__":
    back_ground_thread = Thread(target=background_task)  # Make a thread
    back_ground_thread.start()  # Start the thread
    server()  # start the server

客户端.py

import socket
import pickle


def make_request(name: str, **kwargs):
    return pickle.dumps("type": name, **kwargs)


def send_request(request):
    address = ("localhost", 4000)
    client = socket.socket()
    client.connect(address)
    client.sendall(request)
    client.close()


while True:
    print("\nCommands: set_delay, stop, start")
    command = input(">").split()
    if len(command) == 0:  # If command == []
        pass
    elif command[0] == "start":
        request = make_request("start")
        send_request(request)
    elif command[0] == "stop":
        request = make_request("stop")
        send_request(request)
    elif command[0] == "set_delay" and len(command) > 1:
        request = make_request("start", delay=int(command[1]))
        send_request(request)
    else:
        print("Invalid Request")

现在你可以试着研究一下上面的代码。也请先运行server.py,然后在另一个终端运行client.py。当客户端向服务器发送请求时,您可以看到服务器的行为发生了变化。

这里有一点教程:

socket pickle threading

【讨论】:

以上是关于开发一个基本的命令行实用程序来控制另一个进程[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Linux网络编程学习 ----- 进程控制实例

怎样使用ADB命令强制关闭蓝牙!

命令行信号量实用程序

C#应用程序如何不弹出cmd命令行窗口执行

批处理脚本查找进程PID [关闭]

进程控制