我使用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的建议后,我成功地发现这些进程实际上异常退出了。在调试模式下,我可以确定问题实际上是由arch库中numpy.linalg.pinv()中使用的svd
函数引起的。那么,我的问题是:为什么?它可以使用单进程for循环工作,但无法使用2个或更多进程工作。我不知道该如何解决这个问题。这是一个numpy的bug吗?有人能在这方面帮助我吗?
try: q_res=q.fit(update_freq=500) except: print "Error:...."
,它就可以正常工作。我猜测fit函数可能有问题? - Gauss Leemultiprocessing
spawn
启动方法。或者在Windows上使用任何版本的Python。这些都将从方程式中取出fork()
。Python本身忍受着无数痛苦,以使threading.Thread
线程与fork()
协调一致,但无法做任何事情使其他软件的线程变得合理。 - Tim Peters