【发布时间】:2016-08-08 20:27:38
【问题描述】:
我使用来自 python 的多处理包编写了一个函数,并试图提高我的代码速度。
from arch.univariate import ARX, GARCH
from multiprocessing import Process
import multiprocessing
import time
def batch_learning(X, lag_array=None):
"""
X is a time series array
lag_array contains all possible lag numbers
"""
# init a queue used for triggering different processes
queue = multiprocessing.JoinableQueue()
data = multiprocessing.Queue()
# a worker called ARX_fit triggered by queue.get()
def ARX_fit(queue):
while True:
q = queue.get()
q.volatility = GARCH()
print "Starting to fit lags %s" %str(q.lags.size/2)
try:
q_res=q.fit(update_freq=500)
except:
print "Error:...."
print "finished lags %s" %str(q.lags.size/2)
queue.task_done()
# init four processes
for i in range(4):
process_i = Process(target=ARX_fit, name="Process_%s"%str(i), args=(queue,))
process_i.start()
# put ARX model objects into queue continuously
for num in lag_array:
queue.put(ARX(X, lags=num))
# sync processes here
queue.join()
return
调用函数后:
batch_learning(a, lag_array=range(1,10))
但是它卡在了中间,我得到了如下的打印信息:
Starting to fit lags 1
Starting to fit lags 3
Starting to fit lags 2
Starting to fit lags 4
finished lags 1
finished lags 2
Starting to fit lags 5
finished lags 3
Starting to fit lags 6
Starting to fit lags 7
finished lags 4
Starting to fit lags 8
finished lags 6
finished lags 5
Starting to fit lags 9
它永远运行,但在我的 Mac OS El Captain 上没有任何打印输出。然后使用 PyCharm 调试模式并感谢 Tim Peters 的建议,我成功地发现进程实际上意外退出。在调试模式下,我可以查明它实际上是拱库使用的 numpy.linalg.pinv() 中的 svd 函数导致了这个问题。那么我的问题是:为什么?它适用于单进程 for-loop,但不能适用于 2 个或以上进程。我不知道如何解决这个问题。这是一个麻木的错误吗?有谁能帮帮我吗?
【问题讨论】:
-
奇怪的是,如果我删除了
try: q_res=q.fit(update_freq=500) except: print "Error:...."。它工作正常。我猜fit函数有问题? -
您使用的是什么平台/操作系统? OS X Accelerate 框架存在以类似方式表现出来的多处理问题。
-
@aganders3:我正在使用 Mac OS El Captain。你知道如何解决这个问题吗?
-
据我所知,没有解决方案,但有一些解决方法。这是我们实验室的一大挫折。请参阅此问题以获得进一步解释:stackoverflow.com/questions/9879371/…
-
在对我的“答案”的评论中建议了这一点:尝试使用 Python 3(3.4 或更高版本)和
multiprocessingspawn启动方法。或 Windows 上的任何 Python 版本。这些将fork()排除在外。 Python 本身承受着巨大的痛苦,以使threading.Thread线程与fork()配合得很好,但不能做任何事情来使其他软件的线程正常。
标签: python numpy python-multiprocessing statsmodels