Tag: 多处理

SMP核心,进程和线程如何一起工作?

在单个核心CPU上,每个进程在OS中运行,CPU从一个进程跳转到另一个进程,以充分利用自身。 一个进程可以有很multithreading,在这种情况下,当CPU在相应的进程上运行时,CPU通过这些线程运行。 现在,在多核CPU上: 核心是否在每个进程中一起运行,或者核心可以在特定的时间点在不同的进程中分别运行? 例如,你有程序A运行两个线程。 双核CPU能运行这个程序的两个线程吗? 我认为如果我们使用像OpenMP这样的答案应该是。 但是,当核心运行在OpenMPembedded式过程中时,其中一个内核是否可以简单地切换到其他进程? 对于为单核创build的程序,当以100%运行时,为什么每个核心的CPU利用率分布? (例如80%和20%的双核CPU,在这种情况下,所有内核的利用率总是达到100%)。内核是否试图通过以某种方式运行每个进程的每个线程来相互帮助?

未检测到多处理池中引发的exception

看起来,当多处理.Pool进程发生exception时,没有堆栈跟踪或任何其他指示失败。 例: from multiprocessing import Pool def go(): print(1) raise Exception() print(2) p = Pool() p.apply_async(go) p.close() p.join() 打印1并停止静音。 有趣的是,引发一个BaseException反而起作用。 有什么办法使所有exception的行为与BaseException相同吗?

Django多处理和数据库连接

背景: 我正在使用一个Postgres数据库使用Django的项目。 我们也使用mod_wsgi以防万一,因为我的一些网页search提到了它。 在Web表单提交中,Django视图开始了一个需要大量时间(比用户想要等待的时间更长)的工作,所以我们通过系统调用在后台启动工作。 现在正在运行的作业需要能够读取和写入数据库。 因为这个工作需要很长时间,所以我们使用多处理来并行运行其中的一部分。 问题: 顶层脚本有一个数据库连接,当它产生subprocess时,似乎父进程的连接对subprocess是可用的。 然后,在查询之前,必须调用SET TRANSACTION ISOLATION LEVEL的例外。 研究表明,这是由于尝试在多个进程中使用相同的数据库连接。 我发现一个线程build议在subprocess开始时调用connection.close(),以便Django在需要时自动创build一个新的连接,因此每个subprocess都将具有唯一的连接 – 即不共享。 这对我不起作用,因为在subprocess中调用connection.close()导致父进程抱怨连接丢失。 其他调查结果: 我读过的一些东西似乎表明你不能真正做到这一点,多处理,mod_wsgi和Django不能很好地协作。 我猜这似乎很难相信。 有人build议使用芹菜,这可能是一个长期的解决scheme,但目前我无法安装芹菜,等待一些审批过程,所以现在不是一个选项。 在SO和其他地方发现了几个有关持久数据库连接的参考文献,我认为这是一个不同的问题。 还发现引用psycopg2.pool和pgpool和一些关于保镖。 不可否认的是,我并不了解我读到的大部分内容,但当然并没有像我所期望的那样跳出来。 目前的“解决方法”: 现在,我已经回到了连续运行的事情,它的工作,但比我想要的慢。 任何有关如何使用多处理并行运行的build议? 似乎如果我可以让父母和两个孩子都有独立的数据库连接,事情会好起来的,但我似乎无法得到这种行为。 谢谢,抱歉的长度!

赶上Ctrl + C / SIGINT并在python中优雅退出多进程

如何在多进程python程序中捕获Ctrl + C并正常退出所有进程,我需要解决scheme在unix和windows上都能运行。 我已经尝试了以下内容: import multiprocessing import time import signal import sys jobs = [] def worker(): signal.signal(signal.SIGINT, signal_handler) while(True): time.sleep(1.1234) print "Working…" def signal_handler(signal, frame): print 'You pressed Ctrl+C!' # for p in jobs: # p.terminate() sys.exit(0) if __name__ == "__main__": for i in range(50): p = multiprocessing.Process(target=worker) jobs.append(p) p.start() 这是一种工作,但我不认为这是正确的解决scheme。 编辑:这可能是这个的重复

并发性与Python中的多重处理3

Python 3.2引入了Concurrent Futures ,它似乎是旧的线程和多处理模块的一些高级组合。 与以前的多处理模块相比,使用CPU绑定任务的优点和缺点是什么? 这篇文章build议他们更容易处理 – 是这样吗?

如何解决在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 datetime […]

高效地将一个函数应用到分组的pandasDataFrame上

我经常需要将一个函数应用于一个非常大的DataFrame (混合数据types)的组,并希望利用多个核心。 我可以从组中创build一个迭代器并使用多处理模块,但是效率不高,因为每个组和结果都必须在进程之间进行消息传递。 有没有办法避免酸洗,甚至完全避免DataFrame的复制? 看起来多处理模块的共享内存function仅限于numpy数组。 还有其他的select吗?

Python多处理 – Pipe vs Queue

Python的多处理包中的队列和pipe道有什么根本区别? 在什么情况下应该select一个吗? 什么时候使用Pipe()有利? 什么时候使用Queue()是有利的?

使用多处理时不能pickle <type'instancemethod'> Pool.map()

我正在尝试使用multiprocessing的Pool.map()函数来同时分配工作。 当我使用下面的代码,它工作正常: import multiprocessing def f(x): return x*x def go(): pool = multiprocessing.Pool(processes=4) print pool.map(f, range(10)) if __name__== '__main__' : go() 但是,当我以更面向对象的方式使用它时,它不起作用。 它给出的错误信息是: PicklingError: Can't pickle <type 'instancemethod'>: attribute lookup __builtin__.instancemethod failed 这发生在以下是我的主要程序时: import someClass if __name__== '__main__' : sc = someClass.someClass() sc.go() 以下是我的someClass类: import multiprocessing class someClass(object): def __init__(self): pass def f(self, x): return […]

Python中的multiprocessing.dummy没有使用100%的cpu

我用Python做机器学习项目,所以我必须并行地预测函数,我正在使用我的程序。 from multiprocessing.dummy import Pool from multiprocessing import cpu_count def multi_predict(X, predict, *args, **kwargs): pool = Pool(cpu_count()) results = pool.map(predict, X) pool.close() pool.join() return results 问题是,我所有的CPU只加载20-40%(总计是100%)。 我使用multiprocessing.dummy是因为在酸洗function中多处理模块有问题。