Python:对for循环中的函数调用进行多处理,以便每个调用独立运行

时间:2015-08-02 20:29:55

标签: python multithreading for-loop multiprocessing python-multiprocessing

我有一个加密数字并将其存储在列表中的函数

encrypted = [[0]*10]*1000

def encrypt(i):
        encrypted[i]=bin(i)[2:].zfill(10).decode('hex')

表达式比这复杂得多。我只是陈述一个例子。

现在我想在不同进程或线程中调用多个调用的for循环中的encrypt函数 - 但是由于GIL用于CPU绑定进程,线程无法帮助 - 如果我错了就纠正我。

for i in xrange(1000):
     encrypt(i)

所以循环不应该等待加密一个值来重新开始,以便下一个开始。

因此当i = 1并且加密为1时,For循环应该递增并开始加密2,然后同时加密3.

加密结果应存储在加密列表中(结果顺序并不重要)。

2 个答案:

答案 0 :(得分:1)

好的,先来一些建议。根据您需要运行的线程数量,您应该查看PyPy这听起来像是一种可以从pypy的功能中获益的项目。

以下是Queue文档中的经过编辑的示例,如果我了解您的需要,那么这应该指向正确的方向。

此代码假定您有一个加密数字列表 您的加密函数处理将结果添加到列表或以某种方式存储它们。

def worker():
    while True:
        number = q.get()
        encrypt(number)
        q.task_done()

q = Queue()
for i in range(num_worker_threads):
    t = Thread(target=worker)
    t.daemon = True
    t.start()

for number in numbers:
    q.put(number)

q.join()       # block until all tasks are done

答案 1 :(得分:1)

您可以使用multithreading.Pool

from multiprocessing import Pool

def encrypt(i):
    return bin(i)[2:].zfill(10).decode('hex')

if __name__ == '__main__':
    pool = Pool(processes=4)  # adjust to number of cores
    result = pool.map(encrypt, range(1000))
    print result