您可以为此使用json.dumps() 和json.loads() 或pickle.dumps() 和pickle.loads():
>>> import json
>>> json.dumps(['Hi'])
'["Hi"]'
>>> json.loads(_)
['Hi']
>>> import pickle
>>> pickle.dumps(['Hi'])
b'\x80\x03]q\x00X\x02\x00\x00\x00Hiq\x01a.'
>>> pickle.loads(_)
['Hi']
请注意,如果您想通过特殊课程,您将不得不做一些额外的工作;你需要有函数来转换成 JSON 格式,1 虽然pickle 会自动做事情,但仍然需要访问类。2
但是,我认为最好在 VM 中运行任务执行服务器。虽然这些服务器选项的主要重点是允许可扩展性,但它们在远程方面也相当出色。这抽象出了所有的通信和序列化解决方案,就像@J.F.塞巴斯蒂安说,你真的不需要重新发明。
Celery 可能是最常用的任务执行服务器库。设置需要一些工作,但配置后使用起来很简单:使用 Celery 装饰器标记您的函数以使其成为任务对象,在 VM 上启动工作程序,导入模块,并使用相同的参数调用类方法您将传递给函数本身。3 一旦一切正常,Celery 工作人员可以设置为 Windows 服务。4
# app.py (adapted from examples in the Celery Getting Started tutorial
from celery import Celery
app = Celery('tasks', broker='amqp://guest@localhost//')
@app.task
def my_function(a, b):
return a * b
# main.py
import app
result = app.my_function.delay(4, 5)
print result.get()
但有时,Celery 实在是太麻烦了。如果你需要从函数中使用第三方库,你要么必须在函数中导入它们,要么将它们安装在 Linux 服务器上,因为 Celery 的直观安排。而且我个人在设置 Celery 时遇到了麻烦。
一个更简单的替代方案是 TaskIt.5(完全公开:我是 TaskIt 的开发者。)它使用更传统的服务器-客户端连接方式,所以只需要一个标准的 TCP 套接字即可。默认情况下它使用 JSON 序列化对象,但也支持 pickle。
# server.py
from taskit.backend import BackEnd
def my_function(a, b):
return a * b
backend = BackEnd(dict(my_function=my_function))
backend.main()
# client.py
from taskit.frontend import FrontEnd
backend_addr = '127.0.0.1'
frontend = FrontEnd([backend_addr])
print frontend.work('my_function', 4, 5)