工作线程是否有Pool类,类似于多处理模块的Pool类?
我喜欢例如并行化地图功能的简单方法
def long_running_func(p):
c_func_no_gil(p)
p = multiprocessing.Pool(4)
xs = p.map(long_running_func, range(100))
Run Code Online (Sandbox Code Playgroud)
但是我想在没有创建新流程的开销的情况下这样做.
我知道GIL.但是,在我的用例中,该函数将是一个IO绑定的C函数,python包装器将在实际函数调用之前释放GIL.
我是否必须编写自己的线程池?
我正在学习如何使用Python中threading的multiprocessing模块和并行运行某些操作并加快我的代码.
我发现这很难(可能因为我没有任何理论背景)来理解一个threading.Thread()对象和一个对象之间的区别multiprocessing.Process().
此外,我并不完全清楚如何实例化一个作业队列,并且只有4个(例如)它们并行运行,而另一个则在执行之前等待资源释放.
我发现文档中的示例清晰,但不是很详尽; 一旦我尝试使事情复杂化,我就会收到许多奇怪的错误(比如一种无法腌制的方法,等等).
那么,我什么时候应该使用threading和multiprocessing模块?
您能否将我链接到一些资源,解释这两个模块背后的概念以及如何正确使用它们来完成复杂的任务?
python parallel-processing multithreading process multiprocessing
我有一个持有字典的班级
class OrderBook:
orders = {'Restaurant1': None,
'Restaurant2': None,
'Restaurant3': None,
'Restaurant4': None}
@staticmethod
def addOrder(restaurant_name, orders):
OrderBook.orders[restaurant_name] = orders
Run Code Online (Sandbox Code Playgroud)
我正在运行调用该方法的4个线程(每个餐厅一个)OrderBook.addOrder.这是每个线程运行的函数:
def addOrders(restaurant_name):
#creates orders
...
OrderBook.addOrder(restaurant_name, orders)
Run Code Online (Sandbox Code Playgroud)
这是安全的,还是我必须在打电话前使用锁addOrder?
Python全局解释器锁的功能究竟是什么?编译为字节码的其他语言是否采用类似的机制?
假设我正在使用signal处理程序来处理间隔计时器.
def _aHandler(signum, _):
global SomeGlobalVariable
SomeGlobalVariable=True
Run Code Online (Sandbox Code Playgroud)
我可以设置SomeGlobalVariable而不必担心,在设置SomeGlobalVariable(即Python VM正在执行字节码来设置变量)的不太可能的情况下,信号处理程序中的赋值会破坏某些东西吗?(即亚稳态)
更新:我特别感兴趣的是在处理程序之外进行"复合赋值".
(也许我在想"低级别",这一切都在Python中得到了解......来自嵌入式系统的背景,我不时有这些冲动)
哪些策略和形式的并行化是可行且可用于训练和服务神经网络的?:
我也在寻找有关它们如何用于 TensorFlow、PyTorch 或 MXNet 等的证据。
据我所知,在大型数据集上训练大型神经网络时,至少可以有:
什么时候每种策略更适合哪种类型的问题或神经网络?现代图书馆支持哪些模式?并且可以结合所有四种(2x2)策略吗?
最重要的是,我已经阅读了:
但我不知道到底是什么,指的,例如:Is it的计算梯度的不同批次的数据或计算梯度不同的子图?或者它可能完全指的是其他东西?
如果网络很大,预测/推理也可能很慢,并且模型在服务时可能不适合内存中的单个机器。是否有任何已知的多核和多节点预测解决方案可以处理此类模型?
distributed-computing deep-learning tensorflow mxnet pytorch
我有一个C++程序,它使用C api来使用我的Python库. Python库和C++代码都是多线程的.
特别是,C++程序的一个线程实例化一个继承自的Python对象threading.Thread.我需要所有的C++线程能够调用该对象上的方法.
从我第一次尝试(我天真地只是从主线程实例化对象,然后等待一段时间,然后调用方法)我注意到,执行返回后,与刚刚创建的对象关联的Python线程的执行就会停止到C++程序.
如果执行仍然使用Python(例如,如果我调用PyRun_SimpleString("time.sleep(5)");),Python线程的执行将在后台继续执行,一切正常,直到等待结束并执行返回到C++.
我显然做错了什么.我应该怎么做才能让两个我的C++和Python的多线程和能够彼此很好地工作?我以前没有这方面的经验所以请不要假设!
由于GIL,我认为多线程python进程一次只能运行一个线程,因此cpu使用率不能超过100%.
但我发现下面的代码可以占用顶部950%的CPU使用率.
import threading
import time
def f():
while 1:
pass
for i in range(10):
t = threading.Thread(target=f)
t.setDaemon(True)
t.start()
time.sleep(60)
Run Code Online (Sandbox Code Playgroud)
这与Python解释器使用高达130%的CPU的问题不同.怎么可能?.在那个问题中,OP表示他正在进行I/O密集型负载测试,这可能会释放GIL.但在我的程序中,没有I/O操作.
测试在CPython 2.6.6上运行.
python ×8
bytecode ×1
c++ ×1
cpython ×1
dictionary ×1
locking ×1
mxnet ×1
optimization ×1
process ×1
python-c-api ×1
pytorch ×1
scripting ×1
signals ×1
tensorflow ×1
terminology ×1