13
Mới! Lưu câu hỏi hoặc câu trả lời và sắp xếp nội dung yêu thích của bạn. Tìm hiểu thêm.
Learn more.
Tôi đang cố gắng sử dụng các chủ đề trong một dự án Python mà tôi đang thực hiện, nhưng các chủ đề dường như không hoạt động vì chúng được cho là trong mã của tôi. Có vẻ như tất cả các luồng chạy tuần tự [tức là Thread2 bắt đầu sau khi chủ đề 1 kết thúc, cả hai đều không bắt đầu cùng một lúc]. Tôi đã viết một tập lệnh đơn giản để kiểm tra điều này, và điều đó cũng chạy các chủ đề theo tuần tự.
import threading
def something[]:
for i in xrange[10]:
print "Hello"
def my_thing[]:
for i in xrange[10]:
print "world"
threading.Thread[target=something].start[]
threading.Thread[target=my_thing].start[]
Đây là đầu ra tôi nhận được từ việc chạy nó:
Hello
Hello
Hello
Hello
Hello
Hello
Hello
Hello
Hello
Hello
world
world
world
world
world
world
world
world
world
world
Hành vi tương tự được quan sát với số lượng lặp lớn hơn nhiều của các vòng lặp.
Tôi đã thử tìm kiếm trên web và các câu trả lời cũ hơn, nhưng tôi không thể tìm thấy bất cứ điều gì có ích. Ai đó có thể vui lòng chỉ ra điều gì sai với mã này không?
Martineau
Huy hiệu vàng 116K2525 gold badges160 silver badges285 bronze badges
Đã hỏi ngày 8 tháng 11 năm 2009 lúc 19:11Nov 8, 2009 at 19:11
Hiện tại trong Python, các chủ đề được thay đổi sau khi thực hiện một số lượng hướng dẫn mã byte được chỉ định. Họ không chạy cùng một lúc. Bạn sẽ chỉ thực hiện các chủ đề song song khi một trong số chúng gọi một số mô-đun ảnh hưởng I/O hoặc không ảnh hưởng đến Python có thể phát hành Gil [khóa phiên dịch toàn cầu].
Tôi khá chắc chắn rằng bạn sẽ có được đầu ra trộn lẫn nếu bạn tăng số lượng vòng lặp lên một cái gì đó như 10000. Hãy nhớ rằng chỉ cần sinh sản chủ đề thứ hai cũng mất "rất nhiều" thời gian.
Đã trả lời ngày 8 tháng 11 năm 2009 lúc 19:45Nov 8, 2009 at 19:45
Viraptorviraptorviraptor
32.7k9 Huy hiệu vàng106 Huy hiệu bạc184 Huy hiệu đồng9 gold badges106 silver badges184 bronze badges
6
Trong thời gian, phải mất chủ đề thứ hai để bắt đầu các vòng lặp và in đầu tiên.
Ở đây có vẻ như thế này, bạn có thể thấy chủ đề thứ 2 bắt đầu sau khi lần đầu tiên phát ra một vài địa ngục.
Hello
Hello
Hello
Hello
Hello
Helloworld
Helloworld
Helloworld
Helloworld
Helloworld
world
world
world
world
world
BTW: Ví dụ của bạn không có ý nghĩa gì cả. Lý do duy nhất cho các chủ đề là IO và IO chậm. Khi bạn thêm một ít ngủ để mô phỏng IO, nó sẽ hoạt động như mong đợi:
import threading
from time import sleep
def something[]:
for i in xrange[10]:
sleep[0.01]
print "Hello"
def my_thing[]:
for i in xrange[10]:
sleep[0.01]
print "world"
threading.Thread[target=something].start[]
threading.Thread[target=my_thing].start[]
Một hỗn hợp hoang dã xuất hiện:
worldHello
Helloworld
Helloworld
worldHello
Helloworld
Helloworld
worldHello
Helloworld
worldHello
Helloworld
Martineau
Huy hiệu vàng 116K2525 gold badges160 silver badges285 bronze badges
Đã hỏi ngày 8 tháng 11 năm 2009 lúc 19:11Nov 8, 2009 at 19:15
Hiện tại trong Python, các chủ đề được thay đổi sau khi thực hiện một số lượng hướng dẫn mã byte được chỉ định. Họ không chạy cùng một lúc. Bạn sẽ chỉ thực hiện các chủ đề song song khi một trong số chúng gọi một số mô-đun ảnh hưởng I/O hoặc không ảnh hưởng đến Python có thể phát hành Gil [khóa phiên dịch toàn cầu].Jochen Ritzel
Tôi khá chắc chắn rằng bạn sẽ có được đầu ra trộn lẫn nếu bạn tăng số lượng vòng lặp lên một cái gì đó như 10000. Hãy nhớ rằng chỉ cần sinh sản chủ đề thứ hai cũng mất "rất nhiều" thời gian.29 gold badges196 silver badges191 bronze badges
2
Đã trả lời ngày 8 tháng 11 năm 2009 lúc 19:45
Viraptorviraptor
32.7k9 Huy hiệu vàng106 Huy hiệu bạc184 Huy hiệu đồng
Trong thời gian, phải mất chủ đề thứ hai để bắt đầu các vòng lặp và in đầu tiên.Nov 8, 2009 at 22:11
Ở đây có vẻ như thế này, bạn có thể thấy chủ đề thứ 2 bắt đầu sau khi lần đầu tiên phát ra một vài địa ngục.Dave Kirby
BTW: Ví dụ của bạn không có ý nghĩa gì cả. Lý do duy nhất cho các chủ đề là IO và IO chậm. Khi bạn thêm một ít ngủ để mô phỏng IO, nó sẽ hoạt động như mong đợi:5 gold badges64 silver badges82 bronze badges
Một hỗn hợp hoang dã xuất hiện:
Other than that, it is known that CPython's threads aren't perfect because of the
GIL[PDF], which, in short, means that a lot of the times threads do run sequentially, or something of that sort.
Đã trả lời ngày 8 tháng 11 năm 2009 lúc 19:15Nov 8, 2009 at 19:21
Jochen Ritzeljochen Ritzelabyx
102K29 Huy hiệu vàng196 Huy hiệu bạc191 Huy hiệu Đồng18 gold badges91 silver badges116 bronze badges
1
Hành vi cũng có thể thay đổi tùy thuộc vào việc hệ thống đang sử dụng có bộ xử lý duy nhất hay nhiều bộ xử lý hay không, như được giải thích bởi bài nói chuyện này của David Beazley.
Note threading.Thread[target=threadSet1].start[] the function threadSet1 has not brackets at the end.
import threading
from time import sleep
def spawn[num, typex]:
import time
start = time.time[]
print[num, typex]
def threadSet1[]:
for i in range[1000]:
sleep[0.01]
t = threading.Thread[target=spawn[i, "world"]]
t.daemon = True
t.start[]
def threadSet2[]:
for i in range[1000]:
sleep[0.01]
t = threading.Thread[target=spawn[i, "hello"]]
t.daemon = True
t.start[]
if __name__ == '__main__':
threading.Thread[target=threadSet1].start[]
threading.Thread[target=threadSet2].start[]
Như Viraptor nói, luồng đầu tiên sẽ phát hành GIL sau khi thực thi sys.getCheckInterval [] bytecodes [100 theo mặc định]. Để tóm tắt một cách thô bạo những gì David Beazley nói, trên một hệ thống bộ xử lý duy nhất, chủ đề thứ hai sau đó sẽ có cơ hội tiếp quản. Tuy nhiên, trên một hệ thống đa lõi, luồng thứ hai có thể chạy trên một lõi khác và luồng thứ nhất sẽ cố gắng làm lại khóa và có thể sẽ thành công vì HĐH sẽ không có thời gian để chuyển bộ xử lý. Điều này có nghĩa là trên một hệ thống đa lõi với một luồng liên kết CPU, các chủ đề khác có thể không bao giờ có được một cái nhìn.
Cách làm tròn này là thêm một câu lệnh ngủ cho cả hai vòng để chúng không còn bị ràng buộc CPU.Aug 25 at 4:26