Tôi đang cố gắng chạy 2 chức năng cùng một lúc.
def func1[]:
print['Working']
def func2[]:
print['Working']
func1[]
func2[]
Có ai biết cách để làm điều này không?
Đã hỏi ngày 2 tháng 6 năm 2010 lúc 11:16Jun 2, 2010 at 11:16
1
Làm cái này:
from threading import Thread
def func1[]:
print['Working']
def func2[]:
print["Working"]
if __name__ == '__main__':
Thread[target = func1].start[]
Thread[target = func2].start[]
Đã trả lời ngày 2 tháng 6 năm 2010 lúc 11:19Jun 2, 2010 at 11:19
Chrisgchrisgchrisg
39.1k35 Huy hiệu vàng85 Huy hiệu bạc106 Huy hiệu đồng35 gold badges85 silver badges106 bronze badges
9
Câu trả lời về luồng là tốt, nhưng bạn cần phải cụ thể hơn một chút về những gì bạn muốn làm.
Nếu bạn có hai chức năng mà cả hai đều sử dụng nhiều CPU, việc xâu chuỗi [trong CPython] có thể sẽ không đưa bạn đến đâu. Sau đó, bạn có thể muốn xem mô -đun đa xử lý hoặc có thể bạn có thể muốn sử dụng Jython/Ironpython.
Nếu hiệu suất liên kết của CPU là lý do, bạn thậm chí có thể thực hiện mọi thứ trong [không có luồng] C và có được tốc độ tăng tốc lớn hơn nhiều so với thực hiện hai việc song song trong Python.
Không có thêm thông tin, không dễ dàng đưa ra câu trả lời tốt.
Đã trả lời ngày 2 tháng 6 năm 2010 lúc 11:38Jun 2, 2010 at 11:38
Mattias Nilssonmattias NilssonMattias Nilsson
3,5841 Huy hiệu vàng23 Huy hiệu bạc29 Huy hiệu đồng1 gold badge23 silver badges29 bronze badges
Đ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
import ray
ray.init[]
# Define functions you want to execute in parallel using
# the ray.remote decorator.
@ray.remote
def func1[]:
print["Working"]
@ray.remote
def func2[]:
print["Working"]
# Execute func1 and func2 in parallel.
ray.get[[func1.remote[], func2.remote[]]]
0, sau đó gọi chúng bằng import ray
ray.init[]
# Define functions you want to execute in parallel using
# the ray.remote decorator.
@ray.remote
def func1[]:
print["Working"]
@ray.remote
def func2[]:
print["Working"]
# Execute func1 and func2 in parallel.
ray.get[[func1.remote[], func2.remote[]]]
1.import ray
ray.init[]
# Define functions you want to execute in parallel using
# the ray.remote decorator.
@ray.remote
def func1[]:
print["Working"]
@ray.remote
def func2[]:
print["Working"]
# Execute func1 and func2 in parallel.
ray.get[[func1.remote[], func2.remote[]]]
Nếu
import ray
ray.init[]
# Define functions you want to execute in parallel using
# the ray.remote decorator.
@ray.remote
def func1[]:
print["Working"]
@ray.remote
def func2[]:
print["Working"]
# Execute func1 and func2 in parallel.
ray.get[[func1.remote[], func2.remote[]]]
2 và import ray
ray.init[]
# Define functions you want to execute in parallel using
# the ray.remote decorator.
@ray.remote
def func1[]:
print["Working"]
@ray.remote
def func2[]:
print["Working"]
# Execute func1 and func2 in parallel.
ray.get[[func1.remote[], func2.remote[]]]
3 Kết quả trả về, bạn cần viết lại mã trên một chút, bằng cách thay thế import ray
ray.init[]
# Define functions you want to execute in parallel using
# the ray.remote decorator.
@ray.remote
def func1[]:
print["Working"]
@ray.remote
def func2[]:
print["Working"]
# Execute func1 and func2 in parallel.
ray.get[[func1.remote[], func2.remote[]]]
4 bằng:ret_id1 = func1.remote[]
ret_id2 = func1.remote[]
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ý hoặc sử dụng đa luồng. 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.same code will run on a single machine as well as on a cluster of machines.
Để biết thêm lợi thế của Ray, hãy xem bài viết liên quan này.
Đã trả lời ngày 4 tháng 2 năm 2019 lúc 0:39Feb 4, 2019 at 0:39
Ion stoicaion stoicaIon Stoica
7079 Huy hiệu bạc7 Huy hiệu đồng9 silver badges7 bronze badges
0
Một tùy chọn, có vẻ như nó làm cho hai chức năng chạy cùng một lúc, đang sử dụng mô -đun
import ray
ray.init[]
# Define functions you want to execute in parallel using
# the ray.remote decorator.
@ray.remote
def func1[]:
print["Working"]
@ray.remote
def func2[]:
print["Working"]
# Execute func1 and func2 in parallel.
ray.get[[func1.remote[], func2.remote[]]]
5 [ví dụ trong câu trả lời này].time, is using the
import ray
ray.init[]
# Define functions you want to execute in parallel using
# the ray.remote decorator.
@ray.remote
def func1[]:
print["Working"]
@ray.remote
def func2[]:
print["Working"]
# Execute func1 and func2 in parallel.
ray.get[[func1.remote[], func2.remote[]]]
5 module [example in this answer].Tuy nhiên, nó có một độ trễ nhỏ, như một trang tài liệu Python chính thức mô tả. Một mô -đun tốt hơn để thử sử dụng là
import ray
ray.init[]
# Define functions you want to execute in parallel using
# the ray.remote decorator.
@ray.remote
def func1[]:
print["Working"]
@ray.remote
def func2[]:
print["Working"]
# Execute func1 and func2 in parallel.
ray.get[[func1.remote[], func2.remote[]]]
6.page describes. A better module to try using is
import ray
ray.init[]
# Define functions you want to execute in parallel using
# the ray.remote decorator.
@ray.remote
def func1[]:
print["Working"]
@ray.remote
def func2[]:
print["Working"]
# Execute func1 and func2 in parallel.
ray.get[[func1.remote[], func2.remote[]]]
6.Ngoài ra, có các mô -đun Python khác có thể được sử dụng để thực thi không đồng bộ [hai đoạn mã hoạt động cùng một lúc]. Để biết một số thông tin về họ và giúp chọn một, bạn có thể đọc câu hỏi Overflow Stack này.
Nhận xét từ người dùng khác về mô -đun import ray
ray.init[]
# Define functions you want to execute in parallel using
# the ray.remote decorator.
@ray.remote
def func1[]:
print["Working"]
@ray.remote
def func2[]:
print["Working"]
# Execute func1 and func2 in parallel.
ray.get[[func1.remote[], func2.remote[]]]
5
import ray
ray.init[]
# Define functions you want to execute in parallel using
# the ray.remote decorator.
@ray.remote
def func1[]:
print["Working"]
@ray.remote
def func2[]:
print["Working"]
# Execute func1 and func2 in parallel.
ray.get[[func1.remote[], func2.remote[]]]
Anh ta có thể muốn biết rằng vì khóa phiên dịch toàn cầu, họ sẽ không thực thi chính xác cùng một lúc ngay cả khi máy trong câu hỏi có nhiều CPU. wiki.python.org/moin/globalinterpreterlock
they will not execute at the exact same time even if the machine in
question has multiple CPUs. wiki.python.org/moin/GlobalInterpreterLock
- Jonas Elfström ngày 2 tháng 6 '10 lúc 11:39
Trích dẫn từ tài liệu về mô -đun import ray
ray.init[]
# Define functions you want to execute in parallel using
# the ray.remote decorator.
@ray.remote
def func1[]:
print["Working"]
@ray.remote
def func2[]:
print["Working"]
# Execute func1 and func2 in parallel.
ray.get[[func1.remote[], func2.remote[]]]
5 không hoạt động
import ray
ray.init[]
# Define functions you want to execute in parallel using
# the ray.remote decorator.
@ray.remote
def func1[]:
print["Working"]
@ray.remote
def func2[]:
print["Working"]
# Execute func1 and func2 in parallel.
ray.get[[func1.remote[], func2.remote[]]]
Chi tiết triển khai CPython: Trong CPython, do khóa phiên dịch toàn cầu, chỉ một luồng có thể thực thi mã python cùng một lúc [mặc dù các thư viện định hướng hiệu suất nhất định có thể khắc phục giới hạn này].
Lock, only one thread can execute Python code at once [even though
certain performance-oriented libraries might overcome this limitation].Nếu bạn muốn ứng dụng của mình sử dụng tốt hơn các tài nguyên tính toán của các máy đa lõi, bạn nên sử dụng đa xử lý hoặc đồng thời. Tuy nhiên, luồng vẫn là một mô hình thích hợp nếu bạn muốn chạy đồng thời nhiều tác vụ ràng buộc I/O.
However, threading is still an appropriate model if you
want to run multiple I/O-bound tasks simultaneously.
Đã trả lời ngày 11 tháng 10 năm 2015 lúc 11:07Oct 11, 2015 at 11:07
EdwardedwardEdward
1.0241 Huy hiệu vàng18 Huy hiệu bạc39 Huy hiệu đồng1 gold badge18 silver badges39 bronze badges
4
Mô -đun luồng hoạt động đồng thời không giống như đa xử lý, nhưng thời gian hơi tắt. Mã bên dưới in "1" và "2". Chúng được gọi bởi các chức năng khác nhau tương ứng. Tôi đã nhận thấy rằng khi được in vào bảng điều khiển, chúng sẽ có thời gian hơi khác nhau.
from threading import Thread
def one[]:
while[1 == num]:
print["1"]
time.sleep[2]
def two[]:
while[1 == num]:
print["2"]
time.sleep[2]
p1 = Thread[target = one]
p2 = Thread[target = two]
p1.start[]
p2.start[]
Đầu ra: [Lưu ý không gian là để chờ ở giữa in]
1
2
2
1
12
21
12
1
2
Không chắc chắn nếu có một cách để sửa chữa điều này, hoặc nếu nó quan trọng. Chỉ là một cái gì đó tôi nhận thấy.
Đã trả lời ngày 28 tháng 7 năm 2018 lúc 4:59Jul 28, 2018 at 4:59
Thử cái này
from threading import Thread
def fun1[]:
print["Working1"]
def fun2[]:
print["Working2"]
t1 = Thread[target=fun1]
t2 = Thread[target=fun2]
t1.start[]
t2.start[]
Đã trả lời ngày 27 tháng 6 năm 2018 lúc 13:34Jun 27, 2018 at 13:34
2
Tôi nghĩ rằng những gì bạn đang cố gắng truyền đạt có thể đạt được thông qua đa xử lý. Tuy nhiên, nếu bạn muốn làm điều đó thông qua các chủ đề, bạn có thể làm điều này. Điều này có thể giúp
from threading import Thread
import time
def func1[]:
print 'Working'
time.sleep[2]
def func2[]:
print 'Working'
time.sleep[2]
th = Thread[target=func1]
th.start[]
th2=Thread[target=func2]
th2.start[]
Đã trả lời ngày 14 tháng 8 năm 2018 lúc 12:22Aug 14, 2018 at 12:22
Kiểm tra bằng cách sử dụng apscheduler:
from apscheduler.schedulers.background import BackgroundScheduler
import datetime
dt = datetime.datetime
Future = dt.now[] + datetime.timedelta[milliseconds=2550] # 2.55 seconds from now testing start accuracy
def myjob1[]:
print['started job 1: ' + str[dt.now[]][:-3]] # timed to millisecond because thats where it varies
time.sleep[5]
print['job 1 half at: ' + str[dt.now[]][:-3]]
time.sleep[5]
print['job 1 done at: ' + str[dt.now[]][:-3]]
def myjob2[]:
print['started job 2: ' + str[dt.now[]][:-3]]
time.sleep[5]
print['job 2 half at: ' + str[dt.now[]][:-3]]
time.sleep[5]
print['job 2 done at: ' + str[dt.now[]][:-3]]
print[' current time: ' + str[dt.now[]][:-3]]
print[' do job 1 at: ' + str[Future][:-3] + '''
do job 2 at: ''' + str[Future][:-3]]
sched.add_job[myjob1, 'date', run_date=Future]
sched.add_job[myjob2, 'date', run_date=Future]
Tôi đã nhận được những kết quả này. Điều đó chứng tỏ họ đang chạy cùng một lúc.
current time: 2020-12-15 01:54:26.526
do job 1 at: 2020-12-15 01:54:29.072 # i figure these both say .072 because its 1 line of print code
do job 2 at: 2020-12-15 01:54:29.072
started job 2: 2020-12-15 01:54:29.075 # notice job 2 started before job 1, but code calls job 1 first.
started job 1: 2020-12-15 01:54:29.076
job 2 half at: 2020-12-15 01:54:34.077 # halfway point on each job completed same time accurate to the millisecond
job 1 half at: 2020-12-15 01:54:34.077
job 1 done at: 2020-12-15 01:54:39.078 # job 1 finished first. making it .004 seconds faster.
job 2 done at: 2020-12-15 01:54:39.091 # job 2 was .002 seconds faster the second test
Đã trả lời ngày 15 tháng 12 năm 2020 lúc 10:14Dec 15, 2020 at 10:14
Trong trường hợp bạn cũng muốn đợi cho đến khi cả hai chức năng được hoàn thành:wait until both functions have been completed:
from threading import Thread
def func1[]:
print['Working']
def func2[]:
print["Working"]
if __name__ == '__main__':
Thread[target = func1].start[]
Thread[target = func2].start[]
0Đã trả lời ngày 4 tháng 7 năm 2021 lúc 10:28Jul 4, 2021 at 10:28
thanos.athanos.athanos.a
1.7882 huy hiệu vàng26 Huy hiệu bạc25 Huy hiệu đồng2 gold badges26 silver badges25 bronze badges
Một cách tiếp cận khác để chạy nhiều chức năng đồng thời trong Python là sử dụng
import ray
ray.init[]
# Define functions you want to execute in parallel using
# the ray.remote decorator.
@ray.remote
def func1[]:
print["Working"]
@ray.remote
def func2[]:
print["Working"]
# Execute func1 and func2 in parallel.
ray.get[[func1.remote[], func2.remote[]]]
9 mà tôi không thể thấy trong câu trả lời.from threading import Thread
def func1[]:
print['Working']
def func2[]:
print["Working"]
if __name__ == '__main__':
Thread[target = func1].start[]
Thread[target = func2].start[]
1Out:
from threading import Thread
def func1[]:
print['Working']
def func2[]:
print["Working"]
if __name__ == '__main__':
Thread[target = func1].start[]
Thread[target = func2].start[]
2[NOTE]:NOTE]:
- Cú pháp
9 ở trên có giá trị trên Python 3.7 trở lênimport ray ray.init[] # Define functions you want to execute in parallel using # the ray.remote decorator. @ray.remote def func1[]: print["Working"] @ray.remote def func2[]: print["Working"] # Execute func1 and func2 in parallel. ray.get[[func1.remote[], func2.remote[]]]
- Đa xử lý VS MultiThreading Vs Asyncio
Đã trả lời ngày 19 tháng 10 lúc 6:15Oct 19 at 6:15
Mã này dưới đây có thể chạy 2 chức năng Parallelly:
from threading import Thread
def func1[]:
print['Working']
def func2[]:
print["Working"]
if __name__ == '__main__':
Thread[target = func1].start[]
Thread[target = func2].start[]
3Result:
from threading import Thread
def func1[]:
print['Working']
def func2[]:
print["Working"]
if __name__ == '__main__':
Thread[target = func1].start[]
Thread[target = func2].start[]
4Và, 2 bộ mã bên dưới có thể chạy đồng thời 2 chức năng:
from threading import Thread
def func1[]:
print['Working']
def func2[]:
print["Working"]
if __name__ == '__main__':
Thread[target = func1].start[]
Thread[target = func2].start[]
5from threading import Thread
def func1[]:
print['Working']
def func2[]:
print["Working"]
if __name__ == '__main__':
Thread[target = func1].start[]
Thread[target = func2].start[]
6Result:
from threading import Thread
def func1[]:
print['Working']
def func2[]:
print["Working"]
if __name__ == '__main__':
Thread[target = func1].start[]
Thread[target = func2].start[]
4Và, mã này dưới đây có thể chạy 2 chức năng
ret_id1 = func1.remote[]
ret_id2 = func1.remote[]
ret1, ret2 = ray.get[[ret_id1, ret_id2]]
1 đồng thời và không đồng bộ:from threading import Thread
def func1[]:
print['Working']
def func2[]:
print["Working"]
if __name__ == '__main__':
Thread[target = func1].start[]
Thread[target = func2].start[]
8Result:
from threading import Thread
def func1[]:
print['Working']
def func2[]:
print["Working"]
if __name__ == '__main__':
Thread[target = func1].start[]
Thread[target = func2].start[]
4Đã trả lời ngày 27 tháng 10 lúc 16:09Oct 27 at 16:09
Kai - Kazuya Itokai - Kazuya ItoKai - Kazuya Ito
Huy hiệu vàng 11.5k671 Huy hiệu bạc88 Huy hiệu đồng6 gold badges71 silver badges88 bronze badges