2010-05-07 21 views
15

Tôi cần phải chờ trong một kịch bản cho đến khi một số điều kiện nhất định trở thành sự thật?Có cách nào dễ dàng trong Python để chờ cho đến khi điều kiện nhất định là đúng?

Tôi biết tôi có thể cuộn sự kiện của riêng mình bằng biến điều kiện và bạn bè, nhưng tôi không muốn trải qua tất cả những rắc rối khi triển khai nó, vì một số thay đổi thuộc tính đối tượng đến từ chủ đề bên ngoài trong thư viện C++. .Python), vì vậy tôi không thể chỉ chiếm giữ __setattr__ trong một lớp và đặt biến điều kiện ở đó, để tôi tạo và báo hiệu biến điều kiện Python từ C++ hoặc quấn một biến gốc và đợi nó bằng Python , cả hai đều âm thanh khó xử, không cần thiết phức tạp và nhàm chán.

Có cách nào dễ dàng hơn để thực hiện việc này, ngăn chặn việc bỏ phiếu liên tục của điều kiện không?

Lý tưởng nhất là nó sẽ là dọc theo dòng của

res = wait_until(lambda: some_predicate, timeout) 
if (not res): 
    print 'timed out' 

Trả lời

16

Đáng tiếc là khả năng duy nhất để đáp ứng những hạn chế của bạn là định kỳ thăm dò, ví dụ ....:

import time 

def wait_until(somepredicate, timeout, period=0.25, *args, **kwargs): 
    mustend = time.time() + timeout 
    while time.time() < mustend: 
    if somepredicate(*args, **kwargs): return True 
    time.sleep(period) 
    return False 

hoặc tương tự. Điều này có thể được tối ưu hóa theo một số cách nếu có thể phân tách somepredicate (ví dụ: nếu nó được biết là and của một số mệnh đề, đặc biệt nếu một số mệnh đề có thể được tối ưu hóa bằng cách phát hiện thông qua threading.Event s hoặc bất kỳ thứ gì, v.v ...) , nhưng trong các thuật ngữ chung mà bạn yêu cầu, cách tiếp cận không hiệu quả này là cách duy nhất.

+0

Đó là những gì tôi đã kết thúc làm. May mắn thay, hiệu suất không phải là một vấn đề (đó là một kịch bản thử nghiệm). –

+0

có thể có một giải pháp khác http://stackoverflow.com/a/7836454/995714 –

2

Bạn đã cơ bản đã trả lời câu hỏi của riêng bạn: không có.

Vì bạn đang xử lý thư viện bên ngoài trong boost.python, điều này có thể làm thay đổi đối tượng khi rảnh rỗi, bạn cần phải làm quen với trình xử lý sự kiện hoặc làm việc với điều kiện.

0

Đây là gia hạn luồng để giải pháp của Alex:

import time 
import threading 

# based on https://stackoverflow.com/a/2785908/1056345                                                                   
def wait_until(somepredicate, timeout, period=0.25, *args, **kwargs): 
    must_end = time.time() + timeout 
    while time.time() < must_end: 
     if somepredicate(*args, **kwargs): 
      return True 
     time.sleep(period) 
    return False 

def wait_until_par(*args, **kwargs): 
    t = threading.Thread(target=wait_until, args=args, kwargs=kwargs) 
    t.start() 
    print ('wait_until_par exits, thread runs in background') 

def test(): 
    print('test') 

wait_until_par(test, 5) 
Các vấn đề liên quan