Python中的后台进程
我需要创建一个后台进程,它会等待接收命令并执行这些命令。下面是代码:
instance_tuple.popen = subprocess.Popen(['python',\
os.path.join(config['scripts_dir'],\
'instance_script.py')],\
stdin = subprocess.PIPE,\
stdout = subprocess.PIPE)
进程函数的代码:
if __name__ == '__main__':
config = dict()
is_config_valid = False
print 'Hello from instance process'
while True:
cmd_str = raw_input()
if (cmd_str.strip() != ''):
print 'received %s' % cmd_str
command = json.loads(cmd_str)
print 'received command: %s' % str(command)
sys.stdout.flush()
if command['name'] == 'set_variable':
name = command['args'][0]
value = command['args'][1]
config[name] = value
is_config_valid = validate_instance_dict(config)
elif is_config_valid:
if (command['name'] == 'init_model'):
config['instance'].init_model()
elif (command['name'] == 'get_tree'):
tree = config['instance'].get_fidesys_tree(command['args'])
result = CommandResult(command.name, tree)
print 'process exit'
这是我发送数据到进程的方式:第一次测试运行正常:
(input, errors) = instance_tuple.popen \
.communicate(json.dumps({'name': 'name', 'args': list()}))
但是后来不知道为什么,raw_input()
收到了一个结束信号(EOF),导致进程退出。请问如何正确设置进程间的通信?
4 个回答
0
如果你用“sys.stdin.readline()”代替“raw_input()”,会发生什么呢?
0
我认为 communicate() 会关闭标准输入,这样你的程序就会收到一个结束标志(EOF)。
如果你想多次和它交流,可以使用 popen.stdin.write(...)。
5
我喜欢用zeromq来做这个。 我设置了一个服务器,使用zmq.PULL
这种连接方式,它可以接收客户端通过zmq.PUSH
这种方式发送过来的消息。操作起来非常简单:
import zmq
def client(msg)
context = zmq.Context()
client = context.socket(zmq.PUSH)
client.connect('tcp://127.0.0.1:9999')
client.send(msg)
def server():
context = zmq.Context()
server = context.socket(zmq.PULL)
server.bind('tcp://127.0.0.1:9999')
while True:
msg = server.recv()
..do something with each message
if __name__ == '__main__': server()