Tôi đã nghiên cứu trước và không thể tìm thấy câu trả lời cho câu hỏi của tôi. Tôi đang cố gắng chạy nhiều chức năng song song trong Python.
Tôi có một cái gì đó như thế này:
files.py
import common #common is a util class that handles all the IO stuff
dir1 = 'C:\folder1'
dir2 = 'C:\folder2'
filename = 'test.txt'
addFiles = [25, 5, 15, 35, 45, 25, 5, 15, 35, 45]
def func1[]:
c = common.Common[]
for i in range[len[addFiles]]:
c.createFiles[addFiles[i], filename, dir1]
c.getFiles[dir1]
time.sleep[10]
c.removeFiles[addFiles[i], dir1]
c.getFiles[dir1]
def func2[]:
c = common.Common[]
for i in range[len[addFiles]]:
c.createFiles[addFiles[i], filename, dir2]
c.getFiles[dir2]
time.sleep[10]
c.removeFiles[addFiles[i], dir2]
c.getFiles[dir2]
Tôi muốn gọi func1 và func2 và để chúng chạy cùng một lúc. Các chức năng không tương tác với nhau hoặc trên cùng một đối tượng. Ngay bây giờ tôi phải đợi Func1 kết thúc trước khi Func2 bắt đầu. Làm thế nào để tôi làm một cái gì đó như dưới đây:
process.py
from files import func1, func2
runBothFunc[func1[], func2[]]
Tôi muốn có thể tạo cả hai thư mục khá gần với cùng một lúc vì mỗi phút tôi đang đếm số lượng tệp đang được tạo. Nếu thư mục không có ở đó, nó sẽ loại bỏ thời gian của tôi.
Martineau
Huy hiệu vàng 116K2525 gold badges161 silver badges288 bronze badges
Khi được hỏi ngày 26 tháng 8 năm 2011 lúc 15:46Aug 26, 2011 at 15:46
1
Bạn có thể sử dụng
process.py
from files import func1, func2
runBothFunc[func1[], func2[]]
8 hoặc process.py
from files import func1, func2
runBothFunc[func1[], func2[]]
9.Do đặc thù của Cpython,
process.py
from files import func1, func2
runBothFunc[func1[], func2[]]
8 không có khả năng đạt được sự song song thực sự. Vì lý do này, process.py
from files import func1, func2
runBothFunc[func1[], func2[]]
9 nói chung là đặt cược tốt hơn.Đây là một ví dụ hoàn chỉnh:
from multiprocessing import Process
def func1[]:
print 'func1: starting'
for i in xrange[10000000]: pass
print 'func1: finishing'
def func2[]:
print 'func2: starting'
for i in xrange[10000000]: pass
print 'func2: finishing'
if __name__ == '__main__':
p1 = Process[target=func1]
p1.start[]
p2 = Process[target=func2]
p2.start[]
p1.join[]
p2.join[]
Các cơ chế bắt đầu/tham gia các quá trình con có thể dễ dàng được gói gọn thành một hàm dọc theo các dòng của
from multiprocessing import Process
def func1[]:
print 'func1: starting'
for i in xrange[10000000]: pass
print 'func1: finishing'
def func2[]:
print 'func2: starting'
for i in xrange[10000000]: pass
print 'func2: finishing'
if __name__ == '__main__':
p1 = Process[target=func1]
p1.start[]
p2 = Process[target=func2]
p2.start[]
p1.join[]
p2.join[]
2 của bạn:def runInParallel[*fns]:
proc = []
for fn in fns:
p = Process[target=fn]
p.start[]
proc.append[p]
for p in proc:
p.join[]
runInParallel[func1, func2]
Đã trả lời ngày 26 tháng 8 năm 2011 lúc 15:48Aug 26, 2011 at 15:48
NPENPENPE
474K105 Huy hiệu vàng930 Huy hiệu bạc1002 Huy hiệu Đồng105 gold badges930 silver badges1002 bronze badges
15
Nếu các chức năng của bạn chủ yếu thực hiện công việc I/O [và ít công việc CPU hơn] và bạn có Python 3.2+, bạn có thể sử dụng một ThreadPoolExecutor:I/O work [and less CPU work] and you have Python 3.2+, you can use a ThreadPoolExecutor:
from concurrent.futures import ThreadPoolExecutor
def run_io_tasks_in_parallel[tasks]:
with ThreadPoolExecutor[] as executor:
running_tasks = [executor.submit[task] for task in tasks]
for running_task in running_tasks:
running_task.result[]
run_io_tasks_in_parallel[[
lambda: print['IO task 1 running!'],
lambda: print['IO task 2 running!'],
]]
Nếu các chức năng của bạn chủ yếu thực hiện công việc CPU [và công việc I/O ít hơn] và bạn có Python 2.6+, bạn có thể sử dụng mô -đun đa xử lý:CPU work [and less I/O work] and you have Python 2.6+, you can use the multiprocessing module:
from multiprocessing import Process
def run_cpu_tasks_in_parallel[tasks]:
running_tasks = [Process[target=task] for task in tasks]
for running_task in running_tasks:
running_task.start[]
for running_task in running_tasks:
running_task.join[]
run_cpu_tasks_in_parallel[[
lambda: print['CPU task 1 running!'],
lambda: print['CPU task 2 running!'],
]]
Đã trả lời ngày 14 tháng 5 năm 2019 lúc 21:24May 14, 2019 at 21:24
David Fosterdavid FosterDavid Foster
6.1883 huy hiệu vàng38 Huy hiệu bạc38 Huy hiệu đồng3 gold badges38 silver badges38 bronze badges
4
Điều này có thể được thực hiện một cách thanh lịch với Ray, một hệ thống cho phép bạn dễ dàng song song hóa và phân phối mã python của bạn.
Để song song hóa ví dụ của bạn, bạn cần xác định các chức năng của mình với trình trang trí
from multiprocessing import Process
def func1[]:
print 'func1: starting'
for i in xrange[10000000]: pass
print 'func1: finishing'
def func2[]:
print 'func2: starting'
for i in xrange[10000000]: pass
print 'func2: finishing'
if __name__ == '__main__':
p1 = Process[target=func1]
p1.start[]
p2 = Process[target=func2]
p2.start[]
p1.join[]
p2.join[]
3, sau đó gọi chúng bằng from multiprocessing import Process
def func1[]:
print 'func1: starting'
for i in xrange[10000000]: pass
print 'func1: finishing'
def func2[]:
print 'func2: starting'
for i in xrange[10000000]: pass
print 'func2: finishing'
if __name__ == '__main__':
p1 = Process[target=func1]
p1.start[]
p2 = Process[target=func2]
p2.start[]
p1.join[]
p2.join[]
4.import ray
ray.init[]
dir1 = 'C:\\folder1'
dir2 = 'C:\\folder2'
filename = 'test.txt'
addFiles = [25, 5, 15, 35, 45, 25, 5, 15, 35, 45]
# Define the functions.
# You need to pass every global variable used by the function as an argument.
# This is needed because each remote function runs in a different process,
# and thus it does not have access to the global variables defined in
# the current process.
@ray.remote
def func1[filename, addFiles, dir]:
# func1[] code here...
@ray.remote
def func2[filename, addFiles, dir]:
# func2[] code here...
# Start two tasks in the background and wait for them to finish.
ray.get[[func1.remote[filename, addFiles, dir1], func2.remote[filename, addFiles, dir2]]]
Nếu bạn chuyển cùng một đối số cho cả hai chức năng và đối số là lớn, một cách hiệu quả hơn để làm điều này là sử dụng
from multiprocessing import Process
def func1[]:
print 'func1: starting'
for i in xrange[10000000]: pass
print 'func1: finishing'
def func2[]:
print 'func2: starting'
for i in xrange[10000000]: pass
print 'func2: finishing'
if __name__ == '__main__':
p1 = Process[target=func1]
p1.start[]
p2 = Process[target=func2]
p2.start[]
p1.join[]
p2.join[]
5. Điều này tránh đối số lớn được tuần tự hóa hai lần và để tạo hai bản sao bộ nhớ của nó:largeData_id = ray.put[largeData]
ray.get[[func1[largeData_id], func2[largeData_id]]]
Quan trọng - nếu
from multiprocessing import Process
def func1[]:
print 'func1: starting'
for i in xrange[10000000]: pass
print 'func1: finishing'
def func2[]:
print 'func2: starting'
for i in xrange[10000000]: pass
print 'func2: finishing'
if __name__ == '__main__':
p1 = Process[target=func1]
p1.start[]
p2 = Process[target=func2]
p2.start[]
p1.join[]
p2.join[]
6 và from multiprocessing import Process
def func1[]:
print 'func1: starting'
for i in xrange[10000000]: pass
print 'func1: finishing'
def func2[]:
print 'func2: starting'
for i in xrange[10000000]: pass
print 'func2: finishing'
if __name__ == '__main__':
p1 = Process[target=func1]
p1.start[]
p2 = Process[target=func2]
p2.start[]
p1.join[]
p2.join[]
7 Kết quả trả về, bạn cần viết lại mã như sau:ret_id1 = func1.remote[filename, addFiles, dir1]
ret_id2 = func2.remote[filename, addFiles, dir2]
ret1, ret2 = ray.get[[ret_id1, ret_id2]]
Có một số lợi thế của việc sử dụng Ray so với mô -đun đa xử lý. Cụ thể, cùng một mã sẽ chạy trên một máy cũng như trên một cụm máy. Để biết thêm lợi thế của Ray, hãy xem bài viết liên quan này.same code will run on a single machine as well as on a cluster of machines. For more advantages of Ray see this related post.
Jimh
1.3722 Huy hiệu vàng13 Huy hiệu bạc27 Huy hiệu đồng2 gold badges13 silver badges27 bronze badges
Đã trả lời ngày 3 tháng 2 năm 2019 lúc 19:58Feb 3, 2019 at 19:58
Ion stoicaion stoicaIon Stoica
7079 Huy hiệu bạc7 Huy hiệu đồng9 silver badges7 bronze badges
2
Có vẻ như bạn có một chức năng duy nhất mà bạn cần gọi trên hai tham số khác nhau. Điều này có thể được thực hiện một cách tao nhã bằng cách sử dụng kết hợp
from multiprocessing import Process
def func1[]:
print 'func1: starting'
for i in xrange[10000000]: pass
print 'func1: finishing'
def func2[]:
print 'func2: starting'
for i in xrange[10000000]: pass
print 'func2: finishing'
if __name__ == '__main__':
p1 = Process[target=func1]
p1.start[]
p2 = Process[target=func2]
p2.start[]
p1.join[]
p2.join[]
8 và from multiprocessing import Process
def func1[]:
print 'func1: starting'
for i in xrange[10000000]: pass
print 'func1: finishing'
def func2[]:
print 'func2: starting'
for i in xrange[10000000]: pass
print 'func2: finishing'
if __name__ == '__main__':
p1 = Process[target=func1]
p1.start[]
p2 = Process[target=func2]
p2.start[]
p1.join[]
p2.join[]
9 với Python 3.2+import time
from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor
def sleep_secs[seconds]:
time.sleep[seconds]
print[f'{seconds} has been processed']
secs_list = [2,4, 6, 8, 10, 12]
Bây giờ, nếu hoạt động của bạn bị ràng buộc IO, thì bạn có thể sử dụng
def runInParallel[*fns]:
proc = []
for fn in fns:
p = Process[target=fn]
p.start[]
proc.append[p]
for p in proc:
p.join[]
runInParallel[func1, func2]
0 như vậy:process.py
from files import func1, func2
runBothFunc[func1[], func2[]]
0Lưu ý cách
from multiprocessing import Process
def func1[]:
print 'func1: starting'
for i in xrange[10000000]: pass
print 'func1: finishing'
def func2[]:
print 'func2: starting'
for i in xrange[10000000]: pass
print 'func2: finishing'
if __name__ == '__main__':
p1 = Process[target=func1]
p1.start[]
p2 = Process[target=func2]
p2.start[]
p1.join[]
p2.join[]
9 được sử dụng ở đây để from multiprocessing import Process
def func1[]:
print 'func1: starting'
for i in xrange[10000000]: pass
print 'func1: finishing'
def func2[]:
print 'func2: starting'
for i in xrange[10000000]: pass
print 'func2: finishing'
if __name__ == '__main__':
p1 = Process[target=func1]
p1.start[]
p2 = Process[target=func2]
p2.start[]
p1.join[]
p2.join[]
9 Chức năng của bạn vào danh sách các đối số.Bây giờ, nếu chức năng của bạn bị ràng buộc CPU, thì bạn có thể sử dụng
def runInParallel[*fns]:
proc = []
for fn in fns:
p = Process[target=fn]
p.start[]
proc.append[p]
for p in proc:
p.join[]
runInParallel[func1, func2]
3process.py
from files import func1, func2
runBothFunc[func1[], func2[]]
1Nếu bạn không chắc chắn, bạn chỉ có thể thử cả hai và xem cái nào cho bạn kết quả tốt hơn.
Cuối cùng, nếu bạn đang muốn in ra kết quả của mình, bạn có thể chỉ cần làm điều này:
process.py
from files import func1, func2
runBothFunc[func1[], func2[]]
2Đã trả lời ngày 24 tháng 3 năm 2020 lúc 13:43Mar 24, 2020 at 13:43
BicubeBicubeBICube
4.1311 Huy hiệu vàng21 Huy hiệu bạc41 Huy hiệu đồng1 gold badge21 silver badges41 bronze badges
Vào năm 2021, cách dễ nhất là sử dụng asyncio:
process.py
from files import func1, func2
runBothFunc[func1[], func2[]]
3References:
[1] //docs.python.org/3/l Library/asyncio-task.html
Đã trả lời ngày 12 tháng 1 năm 2021 lúc 21:53Jan 12, 2021 at 21:53
9
Nếu bạn là người dùng Windows và sử dụng Python 3, thì bài đăng này sẽ giúp bạn thực hiện lập trình song song trong Python. Khi bạn chạy một chương trình nhóm của thư viện đa xử lý thông thường, bạn sẽ gặp lỗi về chức năng chính trong chương trình của mình. Điều này là do thực tế là Windows không có chức năng Fork []. Bài viết dưới đây là đưa ra một giải pháp cho vấn đề được đề cập.
//python.6.x6.nabble.com/Multiprocessing-Pool-woes-td5047050.html
Vì tôi đang sử dụng Python 3, tôi đã thay đổi chương trình như thế này:
process.py
from files import func1, func2
runBothFunc[func1[], func2[]]
4Sau chức năng này, mã vấn đề trên cũng được thay đổi một chút như sau:
process.py
from files import func1, func2
runBothFunc[func1[], func2[]]
5Và tôi đã nhận được đầu ra như:
process.py
from files import func1, func2
runBothFunc[func1[], func2[]]
6Tôi nghĩ rằng bài đăng này có thể hữu ích cho một số người dùng Windows.
Đã trả lời ngày 10 tháng 5 năm 2016 lúc 14:50May 10, 2016 at 14:50
Arun Soorajarun SoorajArun Sooraj
7079 Huy hiệu bạc20 Huy hiệu Đồng9 silver badges20 bronze badges
Không có cách nào để đảm bảo rằng hai chức năng sẽ thực thi đồng bộ với nhau, đó dường như là điều bạn muốn làm.
Điều tốt nhất bạn có thể làm là chia chức năng thành nhiều bước, sau đó chờ cả hai kết thúc tại các điểm đồng bộ hóa quan trọng bằng cách sử dụng
def runInParallel[*fns]:
proc = []
for fn in fns:
p = Process[target=fn]
p.start[]
proc.append[p]
for p in proc:
p.join[]
runInParallel[func1, func2]
4 như đề cập đến câu trả lời của @Aix.Điều này tốt hơn
def runInParallel[*fns]:
proc = []
for fn in fns:
p = Process[target=fn]
p.start[]
proc.append[p]
for p in proc:
p.join[]
runInParallel[func1, func2]
5 vì bạn không thể đảm bảo thời gian chính xác. Với sự chờ đợi rõ ràng, bạn đang nói rằng các chức năng phải được thực hiện bước đó trước khi chuyển sang bước tiếp theo, thay vì giả sử nó sẽ được thực hiện trong vòng 10ms không được đảm bảo dựa trên những gì khác đang diễn ra trên máy.Đã trả lời ngày 26 tháng 8 năm 2011 lúc 17:09Aug 26, 2011 at 17:09
Davy8Davy8Davy8
30.4K24 Huy hiệu vàng111 Huy hiệu bạc173 Huy hiệu đồng24 gold badges111 silver badges173 bronze badges
[Về cách tôi có thể đồng thời chạy hai [hoặc nhiều] chức năng trong Python?]
Với
def runInParallel[*fns]:
proc = []
for fn in fns:
p = Process[target=fn]
p.start[]
proc.append[p]
for p in proc:
p.join[]
runInParallel[func1, func2]
6, các tác vụ đồng bộ/async có thể được chạy đồng thời bằng cách:process.py
from files import func1, func2
runBothFunc[func1[], func2[]]
7Đã trả lời ngày 24 tháng 10 lúc 2:30Oct 24 at 2:30
Koyeungkoyeungkoyeung
1041 Huy hiệu bạc2 Huy hiệu đồng1 silver badge2 bronze badges