试图在python中多处理需要list参数的函数

时间:2014-10-19 18:28:07

标签: python mysql multithreading

我的问题是我试图将list作为变量传递给函数,并且我想对函数处理进行多线程处理。我似乎无法使用pool.map,因为它只接受迭代。我似乎无法使用pool.apply,因为它似乎会在游戏池阻挡时阻止它,所以我真的不明白它是如何允许多线程的(不可否认,我不会这样做)。似乎对多线程有所了解。我尝试了pool.apply_async,但程序在几秒钟内完成,并且似乎只处理了大约20000次计算。这里有一些伪代码。

import MySQLdb
from multiprocessing import Pool

def some_math(x, y):
    f(x[1], x[2], y[1], y[2])
    return f

def distance(x):
    x_distances = []
    for y in all_y:
        distance = some_math(x, y)
        if distance > 1000000:
            continue
        else:
            x_distances.append(x[0], y[0],distance)
        mysql.executemany(sql_update, x_distances)
        mydb.commit()

all_x = []
all_y = []
sql_x = 'SELECT id, lat, lng FROM table'
sql_y = 'SELECT id, lat, lng FROM table'
sql_update = 'INSERT INTO distances (id_x, id_y, distance) VALUES (%s, %s, %S)'

cursor.execute(sql_x)
all_x = cursor.fetchall()

cursor.execute(sql_y)
all_y = cursor.fetchall()

p = Pool(4)
for x in all_x:
    p.apply_async(distance, x)

OR,如果使用map:

p = Pool(4)
for x in all_x:
    p.map(distance, x)

错误返回: 处理A距离...

Traceback (most recent call last):
  File "./distance-house.py", line 94, in <module>
    p.map(range, row)
  File "/usr/lib/python2.7/multiprocessing/pool.py", line 251, in map
    return self.map_async(func, iterable, chunksize).get()
  File "/usr/lib/python2.7/multiprocessing/pool.py", line 558, in get
    raise self._value
TypeError: 'float' object has no attribute '__getitem__'

我正在尝试多线程长计算 - 在多对多的基础上计算10,000点之间的距离。目前,这个过程需要几天时间,我认为多处理结果可以真正提高效率。我全神贯注地寻求建议。

2 个答案:

答案 0 :(得分:1)

您可以使用pool.map

p = Pool(4)
p.map(distance, all_x)

根据doc中的第一个示例。它会为你做迭代!

答案 1 :(得分:0)

解决方法的另一种方法是将变量打包在管道中,然后在函数内部解压缩。 示例:

def Add(z):
  x,y = z
  return x + y

a = [ 0 , 1, 2, 3]
b = [ 5, 6, 7, 8]
ab = (a,b)

Add(ab)