如何自动处理 N 个不同独立任务的模块依赖问题? - V2EX
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 3191 次点击
    这是一个创建于 3744 天前的主题,其中的信息可能已经有所发展或是发生改变。

    大概是这样的一个需求:

    一个自动执行特定任务的平台,可添加使用 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     Solana     945 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 29ms UTC 20:07 PVG 04:07 LAX 13:07 JFK 16:07
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86