2011-11-24 30 views
6

Tôi đang cố gắng viết một lớp python sử dụng xử lý song song/luồng để đọc hai cổng nối tiếp (/ dev/ttyS1 và/dev/ttyS2). Cả hai cổng này đang chạy ở tốc độ truyền 19200 và liên tục hoạt động. Tôi đã sử dụng pySerial cho mục đích này.Python nhiều luồng/nhiều quy trình để đọc các cổng nối tiếp

Cả hai thao tác đọc cần phải chạy liên tục và đồng thời. Tôi tự hỏi nếu nên sử dụng thư viện thread hoặc thư viện luồng hoặc thư viện đa xử lý. Tôi chỉ lo lắng vì khóa thông dịch toàn cục mà không cung cấp khả năng phân luồng thực sự cho các hoạt động IO nặng. Nhưng nếu khóa thông dịch toàn cục không ảnh hưởng đến tôi thì tôi sẽ sử dụng mô-đun luồng/luồng. Tuy nhiên nếu nó sau đó tôi sẽ cần phải vượt qua biên dịch các thư viện đa xử lý python bởi vì đây là trên một hệ thống nhúng.

Vì vậy, mã của tôi thường sẽ có luồng1 hoặc process1 = đọc ttyS1 và ghi vào bộ đệm sau khi thực hiện một số thao tác chuỗi trên dòng đọc. thread2 hoặc process2 = đọc ttyS2 và ghi vào bộ đệm khác sau khi thực hiện một số thao tác chuỗi trên dòng đọc. Các chức năng khác vv Các bộ đệm này được sử dụng thêm bởi các phần khác trong mã.

Ngoài ra việc xử lý đa trong python yêu cầu nhiều lõi/cpus?

Cảm ơn bạn đã đọc!

Trả lời

1

GIL được phát hành trong khi hoạt động đọc, vì vậy nó không ảnh hưởng đến bạn nhiều. Biên dịch chéo multiprocessing nghe có vẻ quá mức cần thiết hoặc tối ưu hóa sớm nhất. Hãy giữ mã mô-đun để bạn có thể chuyển đổi sau này.

Tôi tin rằng hiệu suất luồng sẽ phụ thuộc vào hệ điều hành của bạn.Số dặm của bạn sẽ thay đổi, đặc biệt là trên một hệ thống nhúng.

Nếu bạn có một giờ rảnh rỗi, có một talk on the GIL bởi David Beazley (trang trình bày PDF here). Đối với luồng hiệu năng cao, bạn sẽ muốn xem nó để có được các chi tiết khó chịu về cách luồng, GIL và hệ điều hành có thể làm việc cùng nhau để giết hiệu suất.

+0

Cảm ơn thông tin về GIL đang được phát hành. Hệ thống nhúng sử dụng sẽ được sử dụng trên CPU 550 MHz với kiến ​​trúc arm5tel. Tôi đoán bệnh chỉ cần làm một số điểm chuẩn với up thiết lập khác nhau và xem có bao nhiêu tôi có thể nhận ra nó. Ngoài ra cảm ơn cho video bị bệnh hãy nhìn vào nó! – kal

1

Tôi không phải là chuyên gia về chủ đề này, nhưng tôi tiếp tục nhận thấy rằng số lượng tinh tế bổ sung sử dụng threading yêu cầu không đáng giá nếu tôi có thể song song qua các quy trình thay thế.

Mô-đun thứ ba mà bạn không đề cập đến trong số các lựa chọn thay thế là subprocess.

CHỈNH SỬA theo yêu cầu của OP: Bạn có thể đạt được xử lý song song bằng cách tạo tập lệnh riêng cho giao diện nối tiếp. Đây là một bản demo nhanh, nó giả định rằng cả hai tập tin nằm trong cùng một thư mục.

file com.py - kịch bản nối tiếp - Đây chỉ là một giả, nhưng ý tưởng ở đây là kịch bản chạy độc lập, và chỉ sử dụng stdinstdout để giao tiếp với chương trình thạc sĩ.

import sys 

counter = 0 
while True: # The program never ends... will be killed when master is over. 
    counter += 1 
    sys.stdin.readline() 
    sys.stdout.write('Serial from com1 is %d\n' % counter) 
    sys.stdout.flush() 

file master.py - chương trình chính

from subprocess import Popen, PIPE 
from time import sleep 

p = Popen(['python', './com.py'], stdin=PIPE, stdout=PIPE, stderr=PIPE) 
print "serial communication started." # com.py is working but we moved on! 
for i in range(3): 
    p.stdin.write('<command-here>\n') 
    print "comand sent." 
    print "received : %s" % p.stdout.readline() 
    sleep(1) 

Cuối cùng, đây là một bãi chứa của sản lượng dự kiến:

[email protected]:~/Desktop$ ./master.py 
serial communication started. 
comand sent. 
received : Serial from com1 is 1 
comand sent. 
received : Serial from com1 is 2 
comand sent. 
received : Serial from com1 is 3 

HTH!

+0

Bạn có thể giúp tôi hiểu cách xử lý con sẽ hữu ích cho kịch bản của tôi không? Cảm ơn nhiều! – kal

+0

@kal - Xong. Xem chỉnh sửa. – mac

+0

Cảm ơn bạn rất nhiều. Điều này giải quyết những rắc rối của tôi. – kal

Các vấn đề liên quan