gpt4 book ai didi

python - 有可能在 python 3.2 的循环中进行多处理吗?

转载 作者:太空宇宙 更新时间:2023-11-03 11:56:37 24 4
gpt4 key购买 nike

我正在尝试使用 python (3.2) 到多进程 (ubuntu) 来解决大量搜索问题。基本上我想拿一个列表,取出第一个项目,找到与对象具有相同属性的所有其他项目,将找到的项目和目标项目加入一个列表,从原始列表中删除它们,然后(循环)重做一次。多处理旨在跨处理器划分工作。代码执行一次没有问题。事实上,它也会循环,因为异常被忽略了,而且似乎做得很好。但在 30 秒内,它几乎用完了我所有的 16GB 内存。

到目前为止我的两个问题是 1) 我一循环就得到“Exception AssertionError: AssertionError('can only test a child process',) in ignored”(我得到了很多)。随之而来的是大量的 RAM 使用(我认为这可能是相关的,但不确定)。并且 2) 当我使用更大的数据集时,它似乎甚至没有并行执行搜索。

我的代码如下:

class triangleListWorker(multiprocessing.Process):
def __init__(self, work_queue, target, results,start):
super().__init__()
self.work_queue = work_queue
self.results = results
self.target = target
self.startIndex = start
def run(self):
while True:
try:
searching = self.work_queue.get()
self.do_search(searching)

finally:
self.work_queue.task_done()

def do_search(self,searching):
for x in range(len(searching)):
if self.target.same_plane(searching[x]):
self.results.append(self.startIndex+x)

这里我想做的是使用Manager().list()来存储目标对象和搜索对象在同一平面上的所有索引。

    def do_multi_find_connections(self, target,searchList):
work_queue = multiprocessing.JoinableQueue()
#results= multiprocessing.Queue()

cpu_count = multiprocessing.cpu_count()
results = multiprocessing.Manager().list()
range_per_process = len(searchList) // cpu_count
start,end = 0, range_per_process + (len(searchList) % cpu_count)
for i in range(cpu_count):
worker = triangleListWorker(work_queue,target,results,start)
worker.daemon = True
worker.start()
for x in range(cpu_count):
searchsub = [searchList[x] for x in range(start,end)]
work_queue.put(searchList[start:end])
#work_queue.put(searchList[start:end])
start,end = end, end + range_per_process
print(start,end)

work_queue.join()
print( "can continue...")

return results

def find_connections(self, triangle_list,doMultiProcessing):
tlist = [x for x in triangle_list]
print("len tlist", len(tlist))
results = []
self.byPlane = []
if doMultiProcessing:
while len(tlist) > 0:
results = []
target = tlist[0]
#print("target",tcopy[0])
self.do_multi_find_connections(target,tlist)

results = self.do_multi_find_connections(target,tlist)#list of indexes
plane = []

print(len(results))
print(results)
for x in results:
plane.append(tlist[x])
new_tlist = [tlist[x] for x in range(len(tlist)) if not x in results]
print(len(new_tlist))
tlist = new_tlist

self.byPlane.append(plane)

## self.byPlane.append(plane)
## tlist = []

这段代码(可能有点难看)应该循环寻找下一个平面,并通过调用它上面的函数(执行多处理)来耗尽平面中的所有其他内容。

在 Ubuntu 11.04 64、python 3.2 上运行。

最佳答案

我认为 multiprocessing 模块的预期模式是创建一个 Pool,而不是使用循环。并使用 Pool.map_async方法。 IOW,将循环转换为某种迭代器(可能是 generator 方法)。然后将等效的 do_search 方法作为函数和迭代器传递给 map_async

关于python - 有可能在 python 3.2 的循环中进行多处理吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7211776/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com