Mới bắt đầu với python và thực hiện một số bước đầu với threading
- đang thực hiện một số chuyển đổi tệp nhạc và muốn có thể sử dụng nhiều lõi trên máy của tôi (một chuỗi chuyển đổi hoạt động trên mỗi lõi).Làm cách nào để hạn chế số lượng chuỗi hoạt động trong python?
class EncodeThread(threading.Thread):
# this is hacked together a bit, but should give you an idea
def run(self):
decode = subprocess.Popen(["flac","--decode","--stdout",self.src],
stdout=subprocess.PIPE)
encode = subprocess.Popen(["lame","--quiet","-",self.dest],
stdin=decode.stdout)
encode.communicate()
# some other code puts these threads with various src/dest pairs in a list
for proc in threads: # `threads` is my list of `threading.Thread` objects
proc.start()
Mọi thứ hoạt động, tất cả các tệp được mã hóa, bravo! ... tuy nhiên, tất cả các quy trình đều xuất hiện ngay lập tức, nhưng tôi chỉ muốn chạy hai lần tại một thời điểm (một cho mỗi lõi). Ngay sau khi kết thúc, tôi muốn nó chuyển sang danh sách tiếp theo trong danh sách cho đến khi nó kết thúc, sau đó tiếp tục với chương trình.
Làm cách nào để thực hiện việc này?
(Tôi đã xem xét các chức năng bơi thread và hàng đợi nhưng tôi không thể tìm thấy một câu trả lời đơn giản.)
Edit: có lẽ tôi nên thêm rằng mỗi chủ đề của tôi đang sử dụng để chạy một subprocess.Popen
dòng lệnh riêng biệt bộ giải mã (flac) được truyền tới đường truyền được đưa vào dòng lệnh bộ mã hóa (lame/mp3).
Tại sao phải bận tâm? Có gì sai khi để chủ đề của bạn cạnh tranh với nhau? Nó nhanh hơn để có mỗi lõi triệt để bão hòa với công việc. –
Vâng, tôi đoán tôi đã không nghĩ về nó như vậy ... với một thư viện âm nhạc của hơn 2.000 tập tin tôi nghĩ rằng sinh sản (đồng thời) 2.000 giải mã quá trình (flac) đường ống đến 2.000 quá trình mã hóa (lame) cùng một lúc sẽ là phụ tối ưu. Liệu tôi có sai? – thornomad
@thornomad: Vâng, bạn đã sai. Hạn chế chính xác 2 quy trình vì bạn có 2 lõi sai. Một quá trình sẽ không bão hòa một lõi với công việc. Ngay cả một đường ống dẫn ba phần có thể có đủ I/O mà cốt lõi không bị chiếm đóng hoàn toàn. –