小编ric*_*pan的帖子

Python中混合多处理和线程的现状

关于问题6721,在Linux中的同一个python应用程序中使用多处理和用户线程的最佳实践或解决方法是什么,python标准库中的锁应该在fork上清理?

为什么我需要两者?我使用子进程进行大量计算,产生的数据结构太大而无法通过队列返回 - 而是必须立即将它们存储到磁盘中.通过单独的线程监视这些子进程中的每一个似乎是有效的,因此在完成时,线程可以处理将大(例如多GB)数据读回到进程中的IO,其中需要结果以进一步计算.与其他子进程的结果相结合.子进程会间歇性地挂起,我只是(经过大量的冲击)发现是由于使用了日志记录模块而导致的.其他人在这里记录了这个问题:

https://twiki.cern.ch/twiki/bin/view/Main/PythonLoggingThreadingMultiprocessingIntermixedStudy

这指出了这个明显未解决的python问题:python标准库中的锁应该在fork上进行清理; http://bugs.python.org/issue6721

对我追踪到的困难感到震惊,我回答说:

是否有任何理由不在Python中混合使用Multiprocessing和Threading模块

有一个相当无益的建议'小心'并链接到上述.

但是冗长的讨论:问题6721表明在同一个应用程序中使用多处理(或os.fork)和用户线程是一个"错误".由于我对这个问题的理解有限,我在讨论中发现了太多的分歧,无法总结在同一个应用程序中使用多处理和线程的解决方法或策略.我的直接问题是通过禁用日志记录来解决的,但我在父进程和子进程中都创建了少量其他(显式)锁,并且怀疑我正在为自己的进一步间歇性死锁做好准备.

在python(2.7,3.2,3.3)应用程序中使用线程和多处理时,是否可以提供实用建议以避免在使用锁和/或日志记录模块时发生死锁?

python logging multithreading multiprocessing locks

23
推荐指数
1
解决办法
7224
查看次数

用于按规范值管理科学数据依赖图的python解决方案

我有一个科学的数据管理问题似乎很普遍,但我找不到现有的解决方案甚至是它的描述,我一直很困惑.我即将开始重大改写(python),但我认为我最后一次为现有的解决方案投了一个,所以我可以废弃自己的并回到生物学,或者至少学习一些适当的语言以获得更好的谷歌搜索.

问题:我有贵(数小时至数天来计算)和大(GB的)数据属性,它们通常构建为一个或多个其他数据属性转换.我需要保持的这个数据是如何建成的轨道,所以如果它符合这个问题(右规范值,内置),我可以重复使用它作为输入又一次转型,或根据需要构建新的数据.虽然它不应该的问题,我通常我先"增值"有点异类分子生物学信息,例如,与其他研究人员通过其他方法注释的基因和蛋白质的基因组.我需要结合并比较这些数据来做出我自己的推论.通常需要许多中间步骤,并且这些步骤可能很昂贵.此外,最终结果可以成为其他转换的输入.所有这些转换都可以通过多种方式完成:使用不同的初始数据进行限制(例如使用不同的生物),在相同的推论中使用不同的参数值,或者使用不同的推理模型等.分析经常变化并建立在其他人身上以无计划的方式.我需要知道我有什么数据(什么参数或规格完全定义它),所以我可以在适当的时候重复使用它,以及一般的科学完整性.

我的努力一般:我设计我的python类时考虑到描述问题.由类对象构建的所有数据属性由一组参数值描述.我称这些定义参数或规格"def_specs",并且这些def_specs与它们的值的数据的ATT的"形状".进程的整个全局参数状态可能非常大(例如,一百个参数),但是任何一个类提供的数据att仅需要少量这些,至少是直接的.目标是通过测试其形状是否为全局参数状态的子集来检查先前构建的数据是否合适.

在一个类中,通过检查代码很容易找到定义形状所需的def_spec.当模块需要来自另一个模块的数据时,就会产生摩擦.这些数据将具有自己的形状,可能由调用对象作为args传递,但更经常从全局参数状态过滤.应该使用其依赖项的形状来扩充调用类,以便维护其数据的完整描述.从理论上讲,这可以通过检查依赖图来手动完成,但是这个图可以深入,并且有许多模块,我不断改变和添加,并且......我太懒了,不小心手工完成.

因此,程序通过跟踪对其他类属性的调用并通过托管堆栈__get__调用将其形状反馈给调用者来动态地发现数据atts的完整形状.当我重写时,我发现我需要严格控制对构建器类的属性访问,以防止任意信息影响数据.幸运的是,python使用描述符使这很容易.

余数据的ATT的形状存储在数据库,这样我可以查询适当的数据是否(即,其形状是当前参数状态的子集)已经存在.在我的重写中,我正在从mysql通过伟大的SQLAlchemy转移到对象db(ZODB或couchdb?),因为当发现额外的def_spec时,每个类的表都必须被更改,这是一个痛苦,并且因为一些def_spec是python列表或dicts,这是一个很难转换为SQL.

我不认为这个数据管理可以与我的数据转换代码分开,因为需要严格的属性控制,尽管我尽可能地尝试这样做.我可以使用现有的类,通过使用提供def_specs作为类属性的类包装它们,以及通过描述符提供db管理,但这些类是终端的,因为不能进一步发现额外的依赖形状.

如果数据管理不能轻易地与数据结构分开,我想不太可能有一个开箱即用的解决方案,而是一千个特定的解决方案.也许有适用的模式?我很欣赏任何有关如何寻找或更好地描述问题的提示.对我而言,这似乎是一个普遍的问题,尽管管理深层次的数据可能与网络的盛行风不一致.

python aop bioinformatics scientific-computing nosql

8
推荐指数
1
解决办法
1184
查看次数

mongodb查询将doc数组中的每个元素与条件匹配

我有类似的文档:

{_id:1,值:[2,3,4]}

{_id:2,值:[4]}

{_id:3,值:[3,4,5,6,7,8,9,10,11]}

其中每个doc都有一个数组.我需要一个只返回文档的查询,如果它的数组的EACH元素符合所需的条件(而不是任何元素匹配).

例如.像(但不是)的东西

{'values':{'$ gt':1,'$ lt':5}})

这将成功返回前两个但不是第三个doc,因为并非第三个doc的数组'values'的所有元素都符合标准.

显然mongodb在数组查询中使用隐​​式OR,而我需要AND.

我想我可以手动索引每个元素,例如:

collection.find({values.0:{$ gt:1,$ lt:5},values.1:{$ gt:1,$ lt:5},... values.n:{$ gt:1, $ lt:5}})但这对我的高动态数组来说很痛苦.

有没有更好的办法?

注意:我在mongodb-user上询问了这个问题,但是mongodb的新手与$ all运算符产生了混淆.这里我关注doc数组,而不是查询数组.此外,在这个数字的情况下,我意识到可能会编写一个否定所需范围的查询,但一般来说,我将无法编写否定.

arrays mongodb

5
推荐指数
2
解决办法
5214
查看次数