这是我到目前为止找到的最简单的多线程示例:
import multiprocessing
import subprocess
def calculate(value):
return value * 10
if __name__ == '__main__':
pool = multiprocessing.Pool(None)
tasks = range(10000)
results = []
r = pool.map_async(calculate, tasks, callback=results.append)
r.wait() # Wait on the results
print results
我有两个列表和一个索引来访问每个列表中的元素。第一个列表中的第i个位置与第二个列表上的第i个位置相关。我没有使用dict,因为列表是有序的。
我在做的事情是这样的:
for i in xrange(len(first_list)):
# do something with first_list[i] and second_list[i]
所以,使用这个例子,我认为可以创建一个像这样的函数:
#global variables first_list, second_list, i
first_list, second_list, i = None, None, 0
#initialize the lists
...
#have a function to do what the loop did and inside it increment i
def function:
#do stuff
i += 1
但是,这使i
成为共享资源,我不确定这是否安全。在我看来,我的设计并不适合这种多线程方法,但我不确定如何修复它。
这是我想要的一个工作示例(编辑您想要使用的图像):
import multiprocessing
import subprocess, shlex
links = ['http://www.example.com/image.jpg']*10 # don't use this URL
names = [str(i) + '.jpg' for i in range(10)]
def download(i):
command = 'wget -O ' + names[i] + ' ' + links[i]
print command
args = shlex.split(command)
return subprocess.call(args, shell=False)
if __name__ == '__main__':
pool = multiprocessing.Pool(None)
tasks = range(10)
r = pool.map_async(download, tasks)
r.wait() # Wait on the results
答案 0 :(得分:1)
首先,制作一个元组列表可能是有益的,例如
new_list[i] = (first_list[i], second_list[i])
这样,当您更改i
时,您可以确保始终对来自first_list
和second_list
的相同项目进行操作。
其次,假设列表中的i
和i-1
条目之间没有关系,您可以使用函数对一个给定的i值进行操作,并生成一个线程来处理每个i值。考虑
indices = range(len(new_list))
results = []
r = pool.map_async(your_function, indices, callback=results.append)
r.wait() # Wait on the results
这可以给你你想要的东西。