V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
Owenjia
V2EX  ›  Python

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

  •  
  •   Owenjia · 2015-07-14 23:41:51 +08:00 · 2795 次点击
    这是一个创建于 3438 天前的主题,其中的信息可能已经有所发展或是发生改变。

    大概是这样的一个需求:

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

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

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

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

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

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

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

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

    第 1 条附言  ·  2015-07-15 15:34:23 +08:00
    感谢大家的回复,目前准备多了解下 Docker 。
    8 条回复    2015-07-15 08:04:15 +08:00
    lijianying10
        1
    lijianying10  
       2015-07-14 23:46:53 +08:00   ❤️ 1
    所以你需要的是把各种环境隔离开。
    因此这里推荐使用Docker,可以从Busybox开始构建,Image不会太大的。
    性能几乎无损耗。迁移非常方便,可分发。
    希望能帮到楼主。
    lijianying10
        2
    lijianying10  
       2015-07-14 23:47:50 +08:00
    因为不了解业务只能推荐到这里,如果可以详细了解业务内容(特性,特别要求)可以看看能不能帮你出个方案。
    evlos
        3
    evlos  
       2015-07-14 23:57:28 +08:00   ❤️ 1
    推荐用 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
        4
    Owenjia  
    OP
       2015-07-15 00:12:07 +08:00
    @lijianying10
    感谢回复,因为没有用过 Docker,所以刚刚去搜了下相关的文章,如果理解有不对的地方,请谅解。

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

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

    第一种思路有考虑过,模块版本不一致的问题打算当作不同模块来处理。
    至于 Docker,正在了解中,在我认识里大概是类似 chroot 的一个沙盒,能否具体说一下在这种情景中使用 Docker 的好处?似乎 virtualenv 更方便一些。
    hwind
        7
    hwind  
       2015-07-15 02:27:11 +08:00   ❤️ 1
    @Owenjia 首先一个原则应该是“不要重复发明轮子”。已经有Docker之类流行的解决方案的情况下,自己重新做一个类似的东西意义不大。我感觉你用virtualenv的方案是Docker的一个子集。virtualenv可以解决Python模块依赖的问题。不过还有一些其他问题需要考虑, 比如系统模块依赖的问题。假设某个Python程序除了调用Python模块,还依赖于一些系统的库,virtualenv搞不定。另外,沙盒可以保证程序之间互不影响,比如有人写了个程序去kill掉所有其他进程,virtualenv也搞不定。还有比如系统资源分配,你一定不希望某一个程序占用过多的资源。
    lijianying10
        8
    lijianying10  
       2015-07-15 08:04:15 +08:00   ❤️ 1
    ==========可能的利好
    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
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3335 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 10:32 · PVG 18:32 · LAX 02:32 · JFK 05:32
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.