2014-04-16 27 views
7

chương trình của tôi được thiết kế theo cách sau:Chạy vòng lặp vô hạn sử dụng đề trong python

  1. phần đầu tiên của chương trình có giá trị thời gian thực từ một bộ cảm biến và âm mưu sử dụng nó Matplotlib. Việc này phải được thực hiện trong thời gian dài. Và cũng có thể, nó ghi thông tin vào cơ sở dữ liệu.
  2. Phần thứ hai là IP Camera. Tôi phải lấy đầu vào từ Camera IP và hiển thị nó. Để hiển thị, tôi đang sử dụng phương thức imshow của OpenCV. Ngoài ra, tôi đang lưu trữ video từ Camera IP.

Câu hỏi: Tôi có các thuật toán tại chỗ, vấn đề là tôi cần chạy cả hai vòng lặp này trong một thời gian. Điều kiện là tôi không thể thoát khỏi bất kỳ điều gì trong số họ. Bây giờ luồng là một lựa chọn tốt cho điều này nhưng tôi đã đọc về GIL, vậy làm thế nào để tôi đi về việc chạy hai vòng vô hạn?

from multiprocessing import Process 

def methodA(): 
    while TRUE: 
     do something 

def methodB(): 
    while TRUE: 
     do something 

p=Process(target=methodA()) 
p.start() 
p1=Process(target=methodB()) 
p1.start() 

Bây giờ khi tôi bắt đầu quá trình p nó bắt đầu thực hiện, sau đó làm thế nào để bắt đầu p1 để chạy cùng một lúc?

+0

Nếu mối quan tâm duy nhất của bạn đang chạy vòng lặp vô hạn, không có vấn đề thực sự sử dụng đa luồng. – gravetii

+0

Còn GIL thì sao? –

+0

Ngoài ra, một khi tôi bắt đầu thực hiện một chuỗi, làm cách nào để thực hiện chuỗi khác khi luồng đầu tiên đang chạy liên tục/vô hạn? –

Trả lời

17

Theo như tôi đã hiểu câu hỏi của bạn, bạn có hai nhiệm vụ khác nhau mà bạn muốn họ thực hiện liên tục. Bây giờ liên quan đến câu hỏi của bạn:

làm cách nào để tôi chạy về hai vòng vô hạn?

Bạn có thể tạo hai chuỗi khác nhau sẽ chạy các vòng vô hạn này cho bạn. Chuỗi đầu tiên sẽ thực hiện task1 của bạn và chuỗi thứ hai sẽ thực hiện task2.

Ngoài ra, khi tôi bắt đầu thực hiện một chủ đề, làm thế nào để thực hiện chủ đề khác khi thread đầu tiên được chạy liên tục/vô hạn?

Nếu bạn đang sử dụng hai chủ đề khác nhau thì bạn không cần phải lo lắng về vấn đề này. Nếu các chủ đề không chia sẻ bất kỳ tài nguyên nào thì bạn không cần phải lo lắng về thực tế này. Làm thế nào nếu bạn muốn dừng/tạm dừng một sợi từ chủ đề khác hoặc ngược lại, bạn có thể thực hiện một cơ chế sử dụng cờ hoặc khóa. Những câu hỏi này sẽ giúp đỡ trong trường hợp này:

Is there any way to kill a Thread in Python?

Why does the python threading.Thread object has 'start', but not 'stop'?

making-a-program-munltithreaded

dụ mẫu sử dụng luồng:

from threading import Thread 

class myClassA(Thread): 
    def __init__(self): 
     Thread.__init__(self) 
     self.daemon = True 
     self.start() 
    def run(self): 
     while True: 
      print 'A' 

class myClassB(Thread): 
    def __init__(self): 
     Thread.__init__(self) 
     self.daemon = True 
     self.start() 
    def run(self): 
     while True: 
      print 'B' 


myClassA() 
myClassB() 
while True: 
    pass 

Để chia sẻ tài nguyên?

Sử dụng Locks cho chúng. Dưới đây là một số ví dụ.One, twoHow to synchronize threads in python?

gì xảy ra nếu tôi không muốn chạy nó bằng cách sử lớp học? Làm thế nào để tôi làm điều này bằng cách sử dụng chỉ có phương pháp?

from threading import Thread 

def runA(): 
    while True: 
     print 'A\n' 

def runB(): 
    while True: 
     print 'B\n' 

if __name__ == "__main__": 
    t1 = Thread(target = runA) 
    t2 = Thread(target = runB) 
    t1.setDaemon(True) 
    t2.setDaemon(True) 
    t1.start() 
    t2.start() 
    while True: 
     pass 
+0

Vui lòng kiểm tra câu hỏi đã cập nhật nếu bạn chưa làm như vậy, nó sẽ giải thích rõ hơn tình huống. –

+0

Và tôi phải làm gì nếu họ chia sẻ tài nguyên? –

+0

Chà! Cảm ơn câu trả lời. Tôi đã thử và nó hoạt động hoàn hảo! Chỉ cần một số câu hỏi, tại sao bạn chuyển 'Thread' đến lớp? Và nếu tôi không muốn chạy nó bằng cách sử dụng các lớp học thì sao? Làm thế nào để tôi làm điều này bằng cách sử dụng chỉ có phương pháp? –

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