子进程是否通过 multiprocessing 生成共享之前在程序中创建的对象?
我有以下设置:
do_some_processing(filename):
for line in file(filename):
if line.split(',')[0] in big_lookup_object:
# something here
if __name__ == '__main__':
big_lookup_object = marshal.load('file.bin')
pool = Pool(processes=4)
print pool.map(do_some_processing, glob.glob('*.data'))
我正在将一些大对象加载到内存中,然后创建一个需要使用该大对象的工作人员池。大对象是只读访问的,我不需要在进程之间传递它的修改。
我的问题是:大对象是否加载到共享内存中,就像我在 unix/c 中生成一个进程一样,还是每个进程都加载自己的大对象副本?
更新:进一步澄清 - big_lookup_object 是一个共享查找对象。我不需要将其拆分并单独处理。我需要保留一份。我需要拆分它的工作是读取许多其他大文件并根据查找对象查找这些大文件中的项目。
进一步更新:数据库是一个很好的解决方案,memcached 可能是一个更好的解决方案,磁盘上的文件(搁置或 dbm)可能会更好。在这个问题中,我对内存解决方案特别感兴趣。对于最终解决方案,我将使用 hadoop,但我想看看我是否也可以拥有本地内存版本。
最佳答案
Do child processes spawned via multiprocessing share objects created earlier in the program?
Python < 3.8="">yes for Python ≥ 3.8 .
进程有独立的内存空间。
解决方案 1
要充分利用拥有大量 worker 的大型结构,请执行此操作。
把每个worker写成一个“过滤器”——从stdin读取中间结果,然后工作,把中间结果写入stdout。
将所有工作人员连接为管道:
process1 <source | process2 | process3 | ... | processn >result
每个进程读取、执行和写入。
这是非常有效的,因为所有进程都是同时运行的。写入和读取直接通过进程之间的共享缓冲区。
解决方案 2
在某些情况下,您有一个更复杂的结构 - 通常是 扇出 结构。在这种情况下,您的 parent 有多个 child 。
家长打开源数据。 parent fork 了许多 child 。
父级读取源代码,将部分源代码分配给每个同时运行的子级。
当 parent 到达终点时,关闭管道。 child 获得文件结尾并正常完成。
child 的部分写起来很愉快,因为每个 child 都简单地阅读sys.stdin。
parent 在产生所有 child 和正确保留管道方面有一点花哨的步法,但还不错。
Fan-in 是相反的结构。许多独立运行的进程需要将它们的输入交错到一个公共(public)进程中。收集器不那么容易编写,因为它必须从许多来源中读取。
从许多命名管道读取通常使用 select 模块来查看哪些管道有待处理的输入。
解决方案 3
共享查找是数据库的定义。
解决方案 3A – 加载数据库。让工作人员处理数据库中的数据。
解决方案 3B – 使用 werkzeug 创建一个非常简单的服务器(或类似的)提供响应 HTTP GET 的 WSGI 应用程序,以便工作人员可以查询服务器。
解决方案 4
共享文件系统对象。 Unix OS 提供共享内存对象。这些只是映射到内存的文件,以便交换 I/O 而不是更多的约定缓冲读取。
您可以通过多种方式从 Python 上下文中执行此操作
编写一个启动程序,(1) 将你原来的巨大对象分解成更小的对象,(2) 启动工作人员,每个工作人员都有一个更小的对象。较小的对象可以是腌制的 Python 对象,以节省一点点文件读取时间。
编写一个启动程序,该程序 (1) 读取您的原始巨大对象并使用 seek 操作写入一个页面结构的字节编码文件,以确保各个部分很容易找到简单的寻找。这就是数据库引擎所做的——将数据分成页面,通过 seek 轻松定位每个页面。
生成有权访问此大型页面结构文件的工作人员。每个 worker 都可以找到相关的部分并在那里工作。
关于python - 多处理:在进程之间共享一个大的只读对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/659865/
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
在控制台中反复尝试之后,我想到了这种方法,可以按发生日期对类似activerecord的(Mongoid)对象进行分组。我不确定这是完成此任务的最佳方法,但它确实有效。有没有人有更好的建议,或者这是一个很好的方法?#eventsisanarrayofactiverecord-likeobjectsthatincludeatimeattributeevents.map{|event|#converteventsarrayintoanarrayofhasheswiththedayofthemonthandtheevent{:number=>event.time.day,:event=>ev
Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack
使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta
我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何
我想要做的是有2个不同的Controller,client和test_client。客户端Controller已经构建,我想创建一个test_clientController,我可以使用它来玩弄客户端的UI并根据需要进行调整。我主要是想绕过我在客户端中内置的验证及其对加载数据的管理Controller的依赖。所以我希望test_clientController加载示例数据集,然后呈现客户端Controller的索引View,以便我可以调整客户端UI。就是这样。我在test_clients索引方法中试过这个:classTestClientdefindexrender:template=>
我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此
在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',
我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss