Hướng dẫn run multiple functions in parallel python - chạy nhiều chức năng trong python song song

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.

Hướng dẫn run multiple functions in parallel python - chạy nhiều chức năng trong python song song

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.

Hướng dẫn run multiple functions in parallel python - chạy nhiều chức năng trong python song song

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

Hướng dẫn run multiple functions in parallel python - chạy nhiều chức năng trong python song song

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())
0

Lư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)
3

process.py

from files import func1, func2

runBothFunc(func1(), func2())
1

Nế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())
3

References:

[1] https://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

Hướng dẫn run multiple functions in parallel python - chạy nhiều chức năng trong python song song

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.

http://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())
4

Sau 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())
5

Và tôi đã nhận được đầu ra như:

process.py

from files import func1, func2

runBothFunc(func1(), func2())
6

Tô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

Hướng dẫn run multiple functions in parallel python - chạy nhiều chức năng trong python song song

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

Python có thể chạy hai chức năng song song không?

Đa xử lý trong Python cho phép máy tính sử dụng nhiều lõi của CPU để chạy các tác vụ/quy trình song song. Đa xử lý cho phép máy tính sử dụng nhiều lõi của CPU để chạy các tác vụ/quy trình song song.. Multiprocessing enables the computer to utilize multiple cores of a CPU to run tasks/processes in parallel.

Làm thế nào chạy nhiều chức năng đồng thời python?

Làm cách nào để chạy hai chức năng cùng một lúc trong Python ?..
def a ():.
in ("Hàm A đang chạy tại thời điểm:" + str (int (thời gian. thời gian ())) + "giây.").
def b ():.
in ("Hàm B đang chạy tại thời điểm:" + str (int (thời gian. thời gian ())) + "giây.").
luồng.Chủ đề (Target = A).bắt đầu().
luồng.Chủ đề (Target = B) ..

Là xử lý song song có thể trong Python?

Có một số cách phổ biến để song song hóa mã Python.Bạn có thể khởi chạy một số trường hợp ứng dụng hoặc tập lệnh để thực hiện song song.Cách tiếp cận này là tuyệt vời khi bạn không cần trao đổi dữ liệu giữa các công việc song song.You can launch several application instances or a script to perform jobs in parallel. This approach is great when you don't need to exchange data between parallel jobs.

Bạn có thể gọi hai chức năng trong Python không?

Trong Python, bất kỳ chức năng bằng văn bản nào cũng có thể được gọi bởi một hàm khác.Lưu ý rằng đây có thể là cách phá vỡ một vấn đề thanh lịch nhất thành các vấn đề nhỏ.Trong bài viết này, chúng ta sẽ tìm hiểu làm thế nào chúng ta có thể gọi một hàm được xác định từ một chức năng khác với sự trợ giúp của nhiều ví dụ.any written function can be called by another function. Note that this could be the most elegant way of breaking a problem into chunks of small problems. In this article, we will learn how can we call a defined function from another function with help of multiple examples.