Jac*_*per 6 python unix multithreading python-multithreading
我目前在python中使用线程函数并得到以下内容:
In [1]:
import threading
threading.activeCount()
Out[1]:
4
Run Code Online (Sandbox Code Playgroud)
现在在我的终端上,我使用lscpu并了解到每个核心有2个线程,我可以访问4个核心:
kitty@FelineFortress:~$ lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 8
On-line CPU(s) list: 0-7
Thread(s) per core: 2
Core(s) per socket: 4
Socket(s): 1
NUMA node(s): 1
Vendor ID: GenuineIntel
CPU family: 6
Model: 60
Stepping: 3
CPU MHz: 800.000
BogoMIPS: 5786.45
Virtualization: VT-x
L1d cache: 32K
L1i cache: 32K
L2 cache: 256K
L3 cache: 8192K
NUMA node0 CPU(s): 0-7
Run Code Online (Sandbox Code Playgroud)
因此,我应该有超过4个线程来访问.是否有一个python函数,我可以用来增加我使用的核心数量(例如)以获得超过4个线程?或者甚至可以在启动ipython笔记本时在终端上键入内容,如下所示:
ipython notebook n_cores=3
Run Code Online (Sandbox Code Playgroud)
您可以使用多处理来允许Python使用多个核心.只有一点,一个重要的警告:你在Python会话之间传递的所有数据必须是可选择的或通过继承传递,并且在Windows上生成一个新的Python实例,而在Unix系统上它可以分叉.这对Windows系统具有显着的性能影响.
使用多处理的基本示例如下"本周的Python模块":
import multiprocessing
def worker():
"""worker function"""
print 'Worker'
return
if __name__ == '__main__':
jobs = []
for i in range(5):
p = multiprocessing.Process(target=worker)
jobs.append(p)
p.start()
Run Code Online (Sandbox Code Playgroud)
执行时,输出:
Worker
Worker
Worker
Worker
Worker
Run Code Online (Sandbox Code Playgroud)
多处理允许您在不同的核心上进行独立计算,允许CPU限制的任务以较少的开销执行,比传统的流程快得多.
您还应该意识到Python中的线程不会提高性能.它是为了方便而存在(例如在长时间计算期间保持GUI的响应性).原因是由于Python的Global Interpreter Lock或GIL,这些不是本机线程.
这仍然是非常适用的,并且将在可预见的未来.Cpython实现使用以下定义进行引用计数:
typedef struct _object {
_PyObject_HEAD_EXTRA
Py_ssize_t ob_refcnt;
struct _typeobject *ob_type;
} PyObject;
Run Code Online (Sandbox Code Playgroud)
值得注意的是,这不是线程安全的,因此必须实现全局解释器锁,以便只允许使用Python对象执行一个线程,以避免数据争用导致内存问题.
除了多处理(在Windows上需要完整的解释器副本而不是分支,使得它非常缓慢且无法提高性能)时,有许多工具可以尝试侧向全局解释器锁.
最简单的解决方案是Cython.只需要一个没有任何内部对象的函数,然后使用with nogil关键字释放GIL .
从文档中获取的一个简单示例,向您展示如何发布和暂时重新启用GIL:
from cython.parallel import prange
cdef int func(Py_ssize_t n):
cdef Py_ssize_t i
for i in prange(n, nogil=True):
if i == 8:
with gil:
raise Exception()
elif i == 4:
break
elif i == 2:
return i
Run Code Online (Sandbox Code Playgroud)
CPython有一个GI,而Jython和IronPython没有.要小心,因为许多用于高性能计算的C库可能无法与IronPython或Jython一起使用(SciPy对IronPython的支持感到不满,但很久以前就放弃了它,并且它不适用于现代Python版本).
MPI或消息传递接口是C和C++等语言的高性能接口.它允许高效的并行计算,MPI4Py为Python的MPI创建绑定.为了提高效率,您应该只将MPI4Py与NumPy阵列一起使用.
他们的文档中的一个例子是:
from mpi4py import MPI
import numpy
def matvec(comm, A, x):
m = A.shape[0] # local rows
p = comm.Get_size()
xg = numpy.zeros(m*p, dtype='d')
comm.Allgather([x, MPI.DOUBLE],
[xg, MPI.DOUBLE])
y = numpy.dot(A, xg)
return y
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
16840 次 |
| 最近记录: |