如何自动处理 N 个不同独立任务的模块依赖问题?

2015-07-14 23:41:51 +08:00
 Owenjia

大概是这样的一个需求:

一个自动执行特定任务的平台,可添加使用 Python 编写的程序,平台将任务分配给其他节点执行,结束后返回执行结果。

使用的 Python 版本以及返回结果都有相关约定,但是平台中的 N 个独立不相关的程序可能分别依赖不同的第三方模块,要自动的执行这些程序,需要解决模块依赖问题。

现在遇到的问题是: 如何自动解决任务对第三方模块的依赖?
暂时的思路是用 virtualenv,执行任务的节点接收到任务后创建一个环境,安装所需依赖,结束后销毁该环境,然后等待分配新任务……不断循环。

或者把使用频率高的库列一个表,提交的任务只允许使用表中的模块?

还有就是把任务用 cx_Freeze 之类的工具打包后分发,这样会不会更好一点?

以 automated deployment 之类的关键字进行搜索,大多是使用 Fabric,跟需求不太一致。

大家有没有什么好一点的思路?请帮忙指点一下,或者推荐些类似需求的项目参考。

希望上面的描述足够清楚,如有欠妥之处请指出。

2651 次点击
所在节点    Python
8 条回复
lijianying10
2015-07-14 23:46:53 +08:00
所以你需要的是把各种环境隔离开。
因此这里推荐使用Docker,可以从Busybox开始构建,Image不会太大的。
性能几乎无损耗。迁移非常方便,可分发。
希望能帮到楼主。
lijianying10
2015-07-14 23:47:50 +08:00
因为不了解业务只能推荐到这里,如果可以详细了解业务内容(特性,特别要求)可以看看能不能帮你出个方案。
evlos
2015-07-14 23:57:28 +08:00
推荐用 Docker +1,直接制作好特定环境的 Image,这样环境的问题就解决了。

比如这样写好 Java 7 的环境,
https://github.com/Evlos/dockerfile/blob/master/openjdk7/Dockerfile
再引用这个环境,
https://github.com/Evlos/dockerfile/blob/master/bukkit/Dockerfile
然后分发到指定节点创建 container 执行相应的任务。
Owenjia
2015-07-15 00:12:07 +08:00
@lijianying10
感谢回复,因为没有用过 Docker,所以刚刚去搜了下相关的文章,如果理解有不对的地方,请谅解。

Docker 的镜像在分发的时候好像是一样的?这里的各个任务可能依赖不同的第三方模块,所以如果环境一样的话还是没有解决对第三方模块的依赖问题;如果为每个任务分别建立镜像,相比 virtualenv 似乎没有太大优点?
hwind
2015-07-15 00:14:36 +08:00
可以考虑一下两种思路:
1. 在所有执行节点预先安装模块;如果要提交的程序需要的模块不在预安装之列,则允许程序打包第三方模块一起提交。
2. 采用Docker或者类似的sandbox技术,每个程序有独立的sandbox,互不影响。

方案的选择根据你的需求而定。如果你的Python程序大多类似(比如都是做某一类的业务,只是逻辑不同)那么预先安装模块,或者由程序打包模块会比较简单。如果你打算做的是非常通用大Python程序运行平台,那sandbox比较合适,因为预装能覆盖到模块比较有限,另外即使是同一个问题,还有版本差异的问题。
Owenjia
2015-07-15 01:07:12 +08:00
@hwind
打算是通用型的,不过目前测试用的例子大多是爬虫一类的。

第一种思路有考虑过,模块版本不一致的问题打算当作不同模块来处理。
至于 Docker,正在了解中,在我认识里大概是类似 chroot 的一个沙盒,能否具体说一下在这种情景中使用 Docker 的好处?似乎 virtualenv 更方便一些。
hwind
2015-07-15 02:27:11 +08:00
@Owenjia 首先一个原则应该是“不要重复发明轮子”。已经有Docker之类流行的解决方案的情况下,自己重新做一个类似的东西意义不大。我感觉你用virtualenv的方案是Docker的一个子集。virtualenv可以解决Python模块依赖的问题。不过还有一些其他问题需要考虑, 比如系统模块依赖的问题。假设某个Python程序除了调用Python模块,还依赖于一些系统的库,virtualenv搞不定。另外,沙盒可以保证程序之间互不影响,比如有人写了个程序去kill掉所有其他进程,virtualenv也搞不定。还有比如系统资源分配,你一定不希望某一个程序占用过多的资源。
lijianying10
2015-07-15 08:04:15 +08:00
==========可能的利好
1. Docker 安装方便,相对于virtualenv来说,CoreOS直接就安装好了,
1.1 CoreOS 可以部署到各种云平台上,以各种方式(PXE启动,云平台启动,各种虚拟化环境启动)
1.2 Kubernets 管理你的Docker 提供集群的资源调度、部署运行、服务发现、扩容缩容等整一套功能。
1.3 如果集群管理的比较好,上CoreOS可能无需配置,上架机器几分钟就可以开始跑业务。
2. Docker 可以针对环境做出类似Git一样的版本管理。
1.1 对于ABC相同的部分可以直接建立一个Image
1.2 对于A不同的依赖,简历ImageA
1.3 以此类推。
1.4 提交到自己的DockerHub中备用
1.5 Image一般情况下几百MB就挡住了,如果你愿意裁剪,可能几十MB
3. Docker启动速度快,基本上命令输入了之后就跑起来了。
==========特性
4. 方便的持久化方便
5. 灵活的资源调度与管理
6. 我还是不要妄下结论了,如果LZ有机会可以都实践一下,具体有啥不同只有都做过之后LZ才知道。

最后希望能帮到LZ

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/205752

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX