2012-01-08 40 views
5

Tôi là một newbie đa,Python, đa luồng quá chậm, đa tiến

tôi biết điều gì đó về luồng nhưng tôi cần phải tăng tốc độ tính toán này, hy vọng với đa:

Ví dụ Mô tả : gửi chuỗi tới một chuỗi, thay đổi chuỗi + kiểm tra điểm chuẩn, gửi kết quả trả về để in.

from threading import Thread 

class Alter(Thread): 
    def __init__(self, word): 
     Thread.__init__(self) 
     self.word = word 
     self.word2 = '' 

    def run(self): 
     # Alter string + test processing speed 
     for i in range(80000): 
      self.word2 = self.word2 + self.word 

# Send a string to be altered 
thread1 = Alter('foo') 
thread2 = Alter('bar') 
thread1.start() 
thread2.start() 

#wait for both to finish 
while thread1.is_alive() == True: pass 
while thread2.is_alive() == True: pass 


print(thread1.word2) 
print(thread2.word2) 

này hiện mất khoảng 6 giây và tôi cần nó để đi nhanh hơn.
Tôi đã xem xét xử lý đa và không thể tìm thấy thứ gì đó tương đương với mã trên. Tôi nghĩ rằng những gì tôi đang sau là tổng hợp nhưng các ví dụ tôi đã tìm thấy đã khó hiểu. Tôi muốn tận dụng lợi thế của tất cả các lõi (8 lõi) multiprocessing.cpu_count() nhưng tôi thực sự chỉ có mẩu tin lưu trữ thông tin hữu ích về đa xử lý và không đủ để sao chép mã ở trên. Nếu bất cứ ai có thể chỉ cho tôi đi đúng hướng hoặc tốt hơn, hãy cung cấp một ví dụ sẽ được đánh giá cao. Python 3 vui lòng

+2

đừng bận chờ đợi để hoàn thành chuỗi. sử dụng Thread.join()! – soulcheck

+0

tại sao không? Tôi đã làm điều này trong hầu hết các mã của tôi và nếu bạn có thể cung cấp một lý do tốt, tôi sẽ thay đổi tất cả :) – Rhys

+1

cũng ít nhất là tốt như bận rộn chờ đợi và có thể làm cho nó thụ động chờ cho đến khi thread được chấm dứt mà không ăn cpu (mặc dù tôi không thể tìm thấy nó trong các tài liệu i'd wager cpython không bận rộn-chờ đợi trong đó là Thread.join()). – soulcheck

Trả lời

6

Chỉ cần thay thế threading bằng multiprocessingThread với Process. Chủ đề trong Pyton là (gần như) không bao giờ được sử dụng để đạt được hiệu suất vì GIL xấu lớn! Tôi đã giải thích nó trong một số khác SO-post với một số liên kết đến tài liệu và một great talk about threading in python.

Nhưng mô-đun multiprocessing cố ý rất giống với mô-đun luồng. Bạn gần như có thể sử dụng nó như là một thay thế drop-in!

Mô-đun đa xử lý không AFAIK cung cấp chức năng để thực thi việc sử dụng một lượng lõi cụ thể. Nó dựa trên việc thực hiện hệ điều hành. Bạn có thể sử dụng đối tượng Pool và giới hạn các nhân viên-onjects thành core-count. Hoặc bạn có thể tìm một thư viện MPI khác như pypar. Trong Linux, bạn có thể sử dụng một đường ống bên dưới trình bao để bắt đầu nhiều phiên bản trên các lõi khác nhau

+0

Một đọc tốt về cách xử lý Python đa xử lý vs luồng trên đa lõi là [ở đây] (http://www.martinkral.sk/blog/2011/03/python-multicore-vs-threading-example/) – fuzzyanalysis

+0

@Don, Yes ! có vẻ như nó hoạt động. Tôi chỉ cần kiểm tra xem nó chạy nhanh hơn bao nhiêu. một điều mặc dù, đoạn mã trên không chỉ định số lượng lõi được sử dụng ... điều này có dễ bao gồm không? – Rhys

+0

mát mẻ đủ tốt cho tôi. Đã chấp nhận :) – Rhys