Questions tagged «multiprocessing»

多处理是在单个计算机系统中使用两个或多个中央处理单元(CPU)。相关的实现和用法细节因操作系统和编程语言而异。因此,在使用此标签时,请始终为操作系统和语言添加标签。

6
Python多重处理模块的.join()方法到底在做什么?
了解Python 多重处理(来自PMOTW文章),并且希望澄清一下join()方法的。 在2008年的旧教程中,它指出,没有p.join()以下代码中的调用,“子进程将处于空闲状态而不会终止,成为必须手动杀死的僵尸”。 from multiprocessing import Process def say_hello(name='world'): print "Hello, %s" % name p = Process(target=say_hello) p.start() p.join() 我添加的打印输出PID,以及一个time.sleep测试,并就我所知道的,在自己的进程终止: from multiprocessing import Process import sys import time def say_hello(name='world'): print "Hello, %s" % name print 'Starting:', p.name, p.pid sys.stdout.flush() print 'Exiting :', p.name, p.pid sys.stdout.flush() time.sleep(20) p = Process(target=say_hello) …

5
在共享内存中使用numpy数组进行多处理
我想在共享内存中使用一个numpy数组,以便与多处理模块一起使用。困难是像numpy数组一样使用它,而不仅仅是ctypes数组。 from multiprocessing import Process, Array import scipy def f(a): a[0] = -a[0] if __name__ == '__main__': # Create the array N = int(10) unshared_arr = scipy.rand(N) arr = Array('d', unshared_arr) print "Originally, the first two elements of arr = %s"%(arr[:2]) # Create, start, and finish the child processes p …

8
多处理:在进程之间共享一个大型只读对象?
通过多处理程序生成的子进程是否共享程序早期创建的对象? 我有以下设置: 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,但我想看看是否也可以具有本地内存版本。


8
多重处理:使用tqdm显示进度条
为了使我的代码更“ Pythonic”和更快,我使用“ multiprocessing”和一个map函数向其发送a)函数和b)迭代范围。 植入的解决方案(即直接在范围tqdm.tqdm(range(0,30))上调用tqdm不适用于多重处理(如以下代码中所述)。 进度条显示为0到100%(当python读取代码时?),但是它并不表示map函数的实际进度。 如何显示进度条以指示“地图”功能在哪一步? from multiprocessing import Pool import tqdm import time def _foo(my_number): square = my_number * my_number time.sleep(1) return square if __name__ == '__main__': p = Pool(2) r = p.map(_foo, tqdm.tqdm(range(0, 30))) p.close() p.join() 欢迎任何帮助或建议...

9
显示Python多处理池imap_unordered调用的进度?
我有一个脚本可以通过imap_unordered()调用成功完成多处理池任务集: p = multiprocessing.Pool() rs = p.imap_unordered(do_work, xrange(num_tasks)) p.close() # No more work p.join() # Wait for completion 但是,我num_tasks大约是250,000,因此join()锁将主线程锁定了10秒钟左右,我希望能够逐步回显命令行以显示主进程未锁定。就像是: p = multiprocessing.Pool() rs = p.imap_unordered(do_work, xrange(num_tasks)) p.close() # No more work while (True): remaining = rs.tasks_remaining() # How many of the map call haven't been done yet? if (remaining == …

7
Python进程池非守护进程?
是否可以创建非守护进程的python池?我希望一个池能够调用内部有另一个池的函数。 我想要这个,因为守护进程无法创建进程。具体来说,它将导致错误: AssertionError: daemonic processes are not allowed to have children 例如,考虑这样一种情况:其中function_a有一个运行的池,function_b而有一个运行的池function_c。该功能链将失败,因为function_b它正在守护进程中运行,并且守护进程无法创建进程。

6
如何在Python中使用多处理队列?
我很难理解多处理队列如何在python上工作以及如何实现它。假设我有两个python模块,它们从共享文件访问数据,让我们将这两个模块称为writer和Reader。我的计划是使读取器和写入器都将请求放入两个单独的多处理队列中,然后让第三个进程将这些请求循环弹出并照此执行。 我的主要问题是我真的不知道如何正确实现multiprocessing.queue,您不能为每个进程真正实例化对象,因为它们将是单独的队列,如何确保所有进程都与共享队列相关(或在这种情况下,排队)

2
在多个进程之间共享结果队列
该multiprocessing模块的文档显示了如何将队列传递给以开头的进程multiprocessing.Process。但是,如何与开始的异步工作进程共享队列apply_async?我不需要动态加入或其他任何方法,而只是工人(反复)将其结果报告给基地的一种方法。 import multiprocessing def worker(name, que): que.put("%d is done" % name) if __name__ == '__main__': pool = multiprocessing.Pool(processes=3) q = multiprocessing.Queue() workers = pool.apply_async(worker, (33, q)) 失败的原因是: RuntimeError: Queue objects should only be shared between processes through inheritance。我理解这意味着什么,并且我理解继承的建议,而不是要求进行酸洗/取消酸洗(以及所有Windows特殊限制)。但如何做我通过队列的方式,作品?我找不到一个示例,并且我尝试了多种失败的替代方法。请帮助?

5
使用多处理队列,池和锁定的简单示例
我试图阅读http://docs.python.org/dev/library/multiprocessing.html上的文档,但是我仍然在多处理队列,池和锁定方面苦苦挣扎。现在,我能够构建以下示例。 关于队列和池,我不确定我是否以正确的方式理解了这个概念,如果我错了,请纠正我。我想要实现的是一次处理2个请求(此示例中的数据列表中有8个),那么我应该使用什么呢?池中创建2个可以处理两个不同队列的进程(最大2个),还是应该每次仅使用Queue处理2个输入?锁定将是正确打印输出。 import multiprocessing import time data = (['a', '2'], ['b', '4'], ['c', '6'], ['d', '8'], ['e', '1'], ['f', '3'], ['g', '5'], ['h', '7'] ) def mp_handler(var1): for indata in var1: p = multiprocessing.Process(target=mp_worker, args=(indata[0], indata[1])) p.start() def mp_worker(inputs, the_time): print " Processs %s\tWaiting %s seconds" % (inputs, the_time) time.sleep(int(the_time)) …

1
将功能有效地并行应用到分组的熊猫DataFrame
我经常需要将函数应用于非常大的组DataFrame(混合数据类型),并想利用多个内核。 我可以从组中创建一个迭代器并使用多处理模块,但是这样做效率不高,因为每个组和函数的结果都必须经过腌制才能在进程之间进行消息传递。 有什么方法可以避免酸洗,甚至避免DataFrame完全复制?看起来多处理模块的共享内存功能仅限于numpy数组。还有其他选择吗?

6
在多处理进程之间共享大型只读的Numpy数组
我有一个60GB的SciPy阵列(矩阵),必须在5个以上的multiprocessing Process对象之间共享。我看过numpy-sharedmem并在SciPy列表上阅读了此讨论。似乎有两种方法numpy-sharedmem-使用amultiprocessing.RawArray()和将NumPy dtypes映射到ctypes。现在,这numpy-sharedmem似乎是要走的路,但是我还没有看到一个很好的参考示例。我不需要任何类型的锁,因为数组(实际上是矩阵)将是只读的。现在,由于它的大小,我想避免复制。这听起来像是正确的方法是创建唯一的数组作为副本sharedmem数组,然后将它传递给Process对象?几个特定的​​问题: 实际将sharedmem句柄传递给子对象的最佳方法是Process()什么?我是否需要一个队列来传递一个数组?管道会更好吗?我可以仅将它作为参数传递给Process()子类的init(我假设它是被腌制的)吗? 在上面链接的讨论中,提到numpy-sharedmem不是64位安全的吗?我肯定使用了一些不是32位可寻址的结构。 该RawArray()方法是否需要权衡?慢一点,孩子吗? numpy-sharedmem方法是否需要任何ctype到dtype的映射? 有没有人举一些开源代码的例子呢?我是一个非常动手的知识,如果没有任何好的榜样,很难使它成功。 如果有任何其他我可以提供的信息,以帮助其他人进行澄清,请发表评论,然后添加。谢谢! 这需要在Ubuntu Linux和Maybe Mac OS上运行,但是可移植性并不是一个大问题。

4
如何在Python多进程中解决“ AttributeError:__ exit__”问题?
我试图重写一些csv读取代码,以便能够在Python 3.2.2中的多个内核上运行它。我尝试使用Pool多重处理的对象,该对象是根据工作示例改编而成的(并且已经为我的项目的另一部分工作了)。我遇到了一条错误消息,发现很难破译和排除故障。 错误: Traceback (most recent call last): File "parser5_nodots_parallel.py", line 256, in <module> MG,ppl = csv2graph(r) File "parser5_nodots_parallel.py", line 245, in csv2graph node_chunks) File "/Library/Frameworks/Python.framework/Versions/3.2/lib/python3.2/multiprocessing/pool.py", line 251, in map return self.map_async(func, iterable, chunksize).get() File "/Library/Frameworks/Python.framework/Versions/3.2/lib/python3.2/multiprocessing/pool.py", line 552, in get raise self._value AttributeError: __exit__ 相关代码: import csv import time import …

3
Python多处理:了解“块大小”背后的逻辑
哪些因素决定了此类chunksize方法的最佳论点multiprocessing.Pool.map()?该.map()方法似乎对其默认的块大小使用了任意启发式(如下所述);是什么激发了这种选择,并且基于某些特定的情况/设置,是否有一种更周到的方法? 示例-说我是: 传递iterable给的.map()元素大约有1500万; 24个核的机器上工作,使用默认processes = os.cpu_count()内multiprocessing.Pool()。 我天真的想法是给24名工人中的每人一个相等大小的块,即15_000_000 / 24625,000。大块应该在充分利用所有工人的同时减少营业额/间接费用。但这似乎没有为每个工人提供大批量生产的潜在弊端。这是一张不完整的图片,我想念什么? 我的问题的一部分源于if的默认逻辑chunksize=None:both.map()和.starmap()call .map_async(),看起来像这样: def _map_async(self, func, iterable, mapper, chunksize=None, callback=None, error_callback=None): # ... (materialize `iterable` to list if it's an iterator) if chunksize is None: chunksize, extra = divmod(len(iterable), len(self._pool) * 4) # ???? if extra: chunksize += 1 if len(iterable) == …

9
Django多处理和数据库连接
背景: 我正在一个将Django与Postgres数据库一起使用的项目。在某些情况下,我们也会使用mod_wsgi,因为我的一些网络搜索都提到了它。在Web表单提交中,Django视图启动了一个需要大量时间的工作(比用户希望等待的时间还长),因此我们通过后台的系统调用来启动该工作。现在正在运行的作业需要能够读取和写入数据库。因为这项工作需要很长时间,所以我们使用多重处理来并行运行它的各个部分。 问题: 顶级脚本具有数据库连接,当它产生子进程时,似乎父级的连接对子级可用。然后有一个例外,关于在查询之前必须如何调用SET TRANSACTION ISOLATION LEVEL。研究表明,这是由于试图在多个进程中使用相同的数据库连接。我发现一个线程建议在子进程开始时调用connection.close(),以便Django在需要时自动创建一个新连接,因此每个子进程将具有唯一的连接-即不共享。这对我不起作用,因为在子进程中调用connection.close()导致父进程抱怨连接丢失。 其他发现: 我读过的一些东西似乎表明您不能真正做到这一点,并且多处理,mod_wsgi和Django不能很好地配合使用。我猜这似乎很难相信。 有些人建议使用celery,这可能是一个长期解决方案,但是我目前无法安装celery,需要等待一些批准程序,因此现在无法选择。 在SO和其他地方找到了一些有关持久数据库连接的参考,我认为这是一个不同的问题。 还发现了对psycopg2.pool和pgpool的引用以及有关bouncer的内容。诚然,我不了解我所读的大部分内容,但是它确实并没有像我想要的那样让我惊讶。 当前的“工作环境”: 现在,我已经恢复为仅串行运行,并且可以运行,但是速度比我想要的慢。 关于如何使用多处理并行运行的任何建议?好像我可以让父母和两个孩子都具有与数据库的独立连接一样,一切都会好起来的,但是我似乎无法获得这种行为。 谢谢,很抱歉!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.