Python:在 for 循环内对函数调用进行多重处理,以便每个调用独立运行
Python: Multi-processing a function call inside for loop so that each call runs independently
我有一个加密数字并将其存储在列表中的函数
encrypted = [[0]*10]*1000
def encrypt(i):
encrypted[i]=bin(i)[2:].zfill(10).decode('hex')
表达式比这复杂得多。我只是举个例子。
现在我想在 for 循环内调用加密函数,在不同的进程或线程中进行多次调用 - 但是由于 CPU 绑定进程的 GIL,线程不会提供帮助 - 如果我错了请纠正我。
for i in xrange(1000):
encrypt(i)
所以循环不应该等待一个值的加密结束,下一个开始。
所以当 i=1 并且正在加密 1 时,For 循环应该递增并开始加密 2,然后同时加密 3。
加密的结果应该存储在加密列表中(结果的顺序不重要)。
好吧,先给点意见吧。根据您需要 运行 的线程数量,您应该查看 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
您可以使用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
我有一个加密数字并将其存储在列表中的函数
encrypted = [[0]*10]*1000
def encrypt(i):
encrypted[i]=bin(i)[2:].zfill(10).decode('hex')
表达式比这复杂得多。我只是举个例子。
现在我想在 for 循环内调用加密函数,在不同的进程或线程中进行多次调用 - 但是由于 CPU 绑定进程的 GIL,线程不会提供帮助 - 如果我错了请纠正我。
for i in xrange(1000):
encrypt(i)
所以循环不应该等待一个值的加密结束,下一个开始。
所以当 i=1 并且正在加密 1 时,For 循环应该递增并开始加密 2,然后同时加密 3。
加密的结果应该存储在加密列表中(结果的顺序不重要)。
好吧,先给点意见吧。根据您需要 运行 的线程数量,您应该查看 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
您可以使用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