Tôi đã hỏi một câu hỏi tương tự trước đây, nhưng không có phản hồi hữu ích vì vậy tôi sẽ cố gắng làm cho mọi thứ rõ ràng hơn.Multiprocessing and Multithreading
Điều tôi đang tìm là chạy một phương pháp đa xử lý hoặc ưu tiên đa xử lý cho một lệnh linux nhất định. Nếu có ai quen thuộc với Picard, tôi muốn chạy phiên bản cũ hơn trên tệp bam và đồng thời chạy phiên bản mới hơn trên cùng một tệp bam. Ý tưởng là để kiểm tra phiên bản mới hơn nhanh hơn bao nhiêu và nếu nó mang lại kết quả tương tự.
Vấn đề chính của tôi là tôi không biết cách thực hiện đa xử lý trên lệnh Popen. Ví dụ.
cmd1 = ['nice', 'time', 'java', '-Xmx6G', '-jar', '/comparison/old_picard/MarkDuplicates.jar', 'I=/comparison/old.bam', 'O=/comparison/old_picard/markdups/old.dupsFlagged.bam', 'M=/comparison/old_picard/markdups/old.metrics.txt', 'TMP_DIR=/comparison', 'VALIDATION_STRINGENCY=LENIENT', 'ASSUME_SORTED=true']
cmd2 = ['nice', 'time', 'java', '-Xmx6G', '-jar', '/comparison/new_picard/MarkDuplicates.jar', 'I=/comparison/new.bam', 'O=/comparison/new_picard/markdups/new.dupsFlagged.bam', 'M=/comparison/new_picard/markdups/new.metrics.txt', 'TMP_DIR=/comparison', 'VALIDATION_STRINGENCY=LENIENT', 'ASSUME_SORTED=true']
c1 = subprocess.Popen(cmd1, stdout=subprocess.PIPE)
c2 = subprocess.Popen(cmd2, stdout=subprocess.PIPE)
Và sau đó tôi có một chức năng hẹn giờ:
def timeit(c):
past = time.time()
results = [c.communicate()]
present = time.time()
total = present - past
results.append(total)
return results
những gì tôi muốn làm điều này là:
p = Process(target=timeit, args=(c1,c2))
p.start()
p.join()
Tuy nhiên tôi nhận được "Popen đối tượng không iterable" lỗi. Có ai có một ý tưởng tốt hơn những gì tôi có bây giờ? Tôi không muốn đi theo một hướng hoàn toàn khác chỉ để đánh một bức tường khác. Tóm lại, tôi muốn chạy c1 trên một cpu và c2 trên cpu khác cùng một lúc, xin vui lòng giúp đỡ!
Tại sao bạn muốn chạy chúng cùng một lúc? Tôi nghi ngờ bạn sẽ nhận được kết quả có ý nghĩa từ điều này. –
Bạn đã xem xét việc chạy chúng tuần tự, sao cho bạn thực sự có thể bắt chước quá trình đó? CPU không phải là tài nguyên được chia sẻ duy nhất, vì vậy nếu đây là một hoạt động chuyên sâu về bộ nhớ hoặc sử dụng nhiều đĩa, bạn có thể có một quy trình hoặc chuỗi đang thắng và có giao diện nhanh hơn. – Jordan