我正在使用多处理的进程和队列.我并行启动了几个函数,大多数表现得很好:它们完成后,它们的输出转到它们的Queue,它们显示为.is_alive()== False.但由于某种原因,一些功能不起作用.它们总是显示.is_alive()== True,即使在函数的最后一行(一个打印语句说"已完成")完成之后.无论我发布的功能集是什么,都会发生这种情况,即使它只有一个.如果不是并行运行,则函数表现良好并正常返回.什么样的事情可能是什么问题?
这是我用来管理作业的通用功能.我没有展示的是我传递给它的功能.它们很长,经常使用matplotlib,有时会启动一些shell命令,但我无法弄清楚失败的是什么共同点.
def runFunctionsInParallel(listOf_FuncAndArgLists):
"""
Take a list of lists like [function, arg1, arg2, ...]. Run those functions in parallel, wait for them all to finish, and return the list of their return values, in order.
"""
from multiprocessing import Process, Queue
def storeOutputFFF(fff,theArgs,que): #add a argument to function for assigning a queue
print 'MULTIPROCESSING: Launching %s in parallel '%fff.func_name
que.put(fff(*theArgs)) #we're putting return value into queue
print 'MULTIPROCESSING: Finished %s in parallel! '%fff.func_name
# We …Run Code Online (Sandbox Code Playgroud) 目前还不清楚如何Parallel在python中正确地删除joblib的工作者.其他人在这里,这里,这里和这里有类似的问题.
在我的例子中,我正在使用一个由50 joblib名工人组成的 threading后端池.
并行调用(线程):
output = Parallel(n_jobs=50, backend = 'threading')
(delayed(get_output)(INPUT)
for INPUT in list)
Run Code Online (Sandbox Code Playgroud)
在这里,Parallel挂起没有错误,len(list) <= n_jobs但只有在n_jobs => -1.
为了克服这个问题,人们给予 说明如何创建一个超时装饰的Parallel功能(get_output(INPUT)使用)在上面的例子)multiprocessing:
主要功能(装饰):
@with_timeout(10) # multiprocessing
def get_output(INPUT): # threading
output = do_stuff(INPUT)
return output
Run Code Online (Sandbox Code Playgroud)
多处理装饰器:
def with_timeout(timeout):
def decorator(decorated):
@functools.wraps(decorated)
def inner(*args, **kwargs):
pool = multiprocessing.pool.ThreadPool(1)
async_result = pool.apply_async(decorated, args, kwargs)
try:
return …Run Code Online (Sandbox Code Playgroud) screen-scraping web-scraping python-multithreading joblib python-multiprocessing
我有汤,BeautifulSoup因为我不能泡菜.当我尝试pickle对象时,python解释器静默崩溃(这样它就不能作为例外处理).我必须能够pickle对象,以便使用multiprocessing包返回对象(pickles对象在进程之间传递它们).我该如何解决/解决问题?不幸的是,我无法发布该页面的html(它不公开),我一直无法找到问题的可重现的例子.我试图通过循环汤和酸洗单个组件来隔离问题,产生错误的最小的东西是<class 'BeautifulSoup.NavigableString'>.当我打印对象时,它打印出来u'\n'.