[英]Running same function for multiple files in parallel in python
我正在嘗試為多個文件並行運行一個函數,並希望它們在某個點之前終止。
例如:有一個循環
def main():
for item in list:
function_x(item)
function_y(list)
現在我想要的是這個function_x
應該對所有項目並行運行。 但是這個函數應該在我的function_y
被調用之前對所有項目執行。
我打算為此使用芹菜。 但無法理解如何做到這一點。
這是我的最終測試代碼。
我需要做的就是使用多處理庫。
from multiprocessing import Process
from time import sleep
Pros = []
def function_x(i):
for j in range(0,5):
sleep(3)
print i
def function_y():
print "done"
def main():
for i in range(0,3):
print "Thread Started"
p = Process(target=function_x, args=(i,))
Pros.append(p)
p.start()
# block until all the threads finish (i.e. block until all function_x calls finish)
for t in Pros:
t.join()
function_y()
您可以為此使用線程。 thread.join
是你需要的函數,這個函數會阻塞直到線程完成。
你可以這樣做:
import threading
threads = []
def main():
for item in list:
t = threading.Thread(target=function_x, args=(item,))
threads.append(t)
t.start()
# block until all the threads finish (i.e. until all function_a functions finish)
for t in threads:
t.join()
function_y(list)
您可以使用Ray優雅地做到這一點,它是一個用於編寫並行和分布式 Python 的庫。
只需使用@ray.remote
聲明function_x
,然后可以通過使用function_x.remote
調用它來並行執行,並且可以使用ray.get
檢索結果。
import ray
import time
ray.init()
@ray.remote
def function_x(item):
time.sleep(1)
return item
def function_y(list):
pass
list = [1, 2, 3, 4]
# Process the items in parallel.
results = ray.get([function_x.remote(item) for item in list])
function_y(list)
查看Ray 文檔。
Here is the documentation for celery groups ,這就是我認為你想要的。 使用AsyncResult.get()
而不是AsyncResult.ready()
來阻止。
#!/bin/env python
import concurrent.futures
def function_x(item):
return item * item
def function_y(lst):
return [x * x for x in lst]
a_list = range(10)
if __name__ == '__main__':
with concurrent.futures.ThreadPoolExecutor(10) as tp:
future_to_function_x = {
tp.submit(function_x, item): item
for item in a_list
}
results = {}
for future in concurrent.futures.as_completed(future_to_function_x):
item = future_to_function_x[future]
try:
res = future.result()
except Exception as e:
print('Exception when processing item "%s": %s' % (item, e))
else:
results[item] = res
print('results:', results)
after = function_y(results.values())
print('after:', after)
輸出:
results: {0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}
after: [0, 1, 16, 81, 256, 625, 1296, 2401, 4096, 6561]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.