2 回答
TA贡献1898条经验 获得超8个赞
这样的事情应该有助于恕我直言
import shlex
import subprocess
def get_output(command, working_folder=None):
logging.debug("Executing %s in %s", command, working_folder)
try:
output = subprocess.check_output(shlex.split(command), cwd=working_folder)
return output.decode("utf-8")
except OSError:
logging.error("Command being executed: {}".format(command))
raise
TA贡献1880条经验 获得超4个赞
实际上,我刚刚记得一个更好的解决方案是使用异步消息队列库。我熟悉的并且很容易适应的是 ZMQ https://zeromq.org/。使用 Go 脚本作为服务器侦听和 django 应用程序请求作为作业的客户端来进行服务器/客户端设置非常容易。
作为概念证明,这里是来自不同库文档的片段。
GO中的服务器
这个脚本就是服务端,用Go写的,我相信可以设置成服务持续运行,等待django发送job来做。
// source: https://github.com/pebbe/zmq4/blob/master/examples/hwserver.go
//
// Hello World server.
// Binds REP socket to tcp://*:5555
// Expects "Hello" from client, replies with "World"
//
package main
import (
zmq "github.com/pebbe/zmq4"
"fmt"
"time"
)
func main() {
// Socket to talk to clients
responder, _ := zmq.NewSocket(zmq.REP)
defer responder.Close()
responder.Bind("tcp://*:5555")
for {
// Wait for next request from client
msg, _ := responder.Recv(0)
fmt.Println("Received ", msg)
// Do some 'work', can take a whilst
time.Sleep(time.Second)
// Send reply back to client
reply := "World"
responder.Send(reply, 0)
fmt.Println("Sent ", reply)
}
}
python中的客户端
这是可以在任何 http 请求中轻松调用的 python 应用程序。它可以创建 zmq 上下文并开始向 go 服务器发送要做的事情。
# source: http://zguide.zeromq.org/py:hwclient
#
# Hello World client in Python
# Connects REQ socket to tcp://localhost:5555
# Sends "Hello" to server, expects "World" back
#
import zmq
context = zmq.Context()
# Socket to talk to server
print("Connecting to hello world server…")
socket = context.socket(zmq.REQ)
socket.connect("tcp://localhost:5555")
# Do 10 requests, waiting each time for a response
for request in range(10):
print("Sending request %s …" % request)
socket.send(b"Hello")
# Get the reply.
message = socket.recv()
print("Received reply %s [ %s ]" % (request, message))
# Gracefully closing the sockects
socket.close()
context.term()
# Back to normal django stuff
这种方法的创建是客户端可以动态创建和关闭 zmq 上下文。此外,您甚至不必在同一台服务器上运行 go 脚本。您可以与任何 IP 地址进行通信。如果您注意至少对包进行加密,请查看 ZMQ 提供的安全功能。
--
注意:我知道我在回答我自己的问题,但这就像给 IT 打电话一样,您需要在他们接电话时立即给他们打电话以解决问题
- 2 回答
- 0 关注
- 108 浏览
添加回答
举报