2017-07-20 18 views
14

Giả sử tôi có hàm python chạy dài trông giống như thế này?Làm thế nào để timeout một chương trình chạy dài bằng cách sử dụng rxpython?

import random 
import time 
from rx import Observable 
def intns(x): 
    y = random.randint(5,10) 
    print(y) 
    print('begin') 
    time.sleep(y) 
    print('end') 
    return x 

Tôi muốn có thể đặt thời gian chờ là 1000ms.

Vì vậy, tôi là một cái gì đó giống như, tạo ra một quan sát và lập bản đồ nó thông qua các tính toán cường độ trên.

a = Observable.repeat(1).map(lambda x: intns(x)) 

Bây giờ cho mỗi giá trị phát ra, nếu nó mất hơn 1000ms Tôi muốn chấm dứt quan sát, ngay sau khi tôi đạt 1000ms sử dụng on_error hoặc on_completed

a.timeout(1000).subscribe(lambda x: print(x), lambda x: print(x)) 

trên tuyên bố không có thời gian chờ, và gọi on_error, nhưng nó tiếp tục kết thúc tính toán phép tính cường độ cao và chỉ sau đó trả về các câu lệnh tiếp theo. Có cách nào tốt hơn để làm điều này?

Tuyên bố cuối cùng in ra

8 # no of seconds to sleep 
begin # begins sleeping, trying to emit the first value 
Timeout # operation times out, and calls on_error 
end # thread waits till the function ends 

ý tưởng sau đây là nếu một hàm timesout Đặc biệt, tôi muốn để có thể tiếp tục với chương trình của tôi, và bỏ qua kết quả.

Tôi đã tự hỏi nếu chức năng intns được thực hiện trên một chủ đề riêng biệt, tôi đoán chủ đề chính tiếp tục thực hiện sau khi hết thời gian chờ, nhưng tôi vẫn muốn dừng tính năng intns chức năng trên một chủ đề hoặc giết nó bằng cách nào đó.

Trả lời

0

Bạn có thể thực hiện việc này một phần bằng cách sử dụng luồng Mặc dù không có cách nào cụ thể để tiêu diệt một chuỗi trong python, nhưng bạn có thể thực hiện một phương thức để gắn cờ luồng.

này sẽ không hoạt động nếu thread đang chờ vào các nguồn lực khác (trong trường hợp của bạn, bạn mô phỏng một "dài" chạy mã bởi một chờ đợi ngẫu nhiên)

Xem thêm Is there any way to kill a Thread in Python?

+0

Ví dụ hiển thị hành vi này sẽ khá đẹp – Adonis

+0

Vui lòng xem câu trả lời mới –

0

Bằng cách này nó hoạt động:

import random 
import time 
import threading 
import os 

def intns(x): 
    y = random.randint(5,10) 
    print(y) 
    print('begin') 
    time.sleep(y) 
    print('end') 
    return x 


thr = threading.Thread(target=intns, args=([10]), kwargs={}) 
thr.start() 
st = time.clock(); 
while(thr.is_alive() == True): 
    if(time.clock() - st > 9): 
     os._exit(0) 
+0

Nó hoạt động, nhưng không liên quan đến gói 'rx' là cốt lõi của câu hỏi – Adonis

+0

Không thực sự, anh ấy đã không 't hỏi làm thế nào để làm điều đó với rx, ông chỉ nói rằng ông đã cố gắng làm điều đó với rx –

+0

đúng, tôi đã không nhận thấy' rx 'trong' rxpython 'anyway tôi nghĩ rằng ông đã không thực sự quan tâm đến gói rx –

0

Dưới đây là một ví dụ cho thời gian chờ

import random 
import time 
import threading 

_timeout = 0 

def intns(loops=1): 
    print('begin') 
    processing = 0 
    for i in range(loops): 
     y = random.randint(5,10) 
     time.sleep(y) 
     if _timeout == 1: 
      print('timedout end') 
      return 
     print('keep processing') 
    return 

# this will timeout 
timeout_seconds = 10 
loops = 10 

# this will complete 
#timeout_seconds = 30.0 
#loops = 1 

thr = threading.Thread(target=intns, args=([loops]), kwargs={}) 
thr.start() 
st = time.clock(); 
while(thr.is_alive() == True): 
    if(time.clock() - st > timeout_seconds): 
     _timeout = 1 

thr.join() 
if _timeout == 0: 
    print ("completed") 
else: 
    print ("timed-out") 
+1

và làm thế nào để bạn đề nghị kết hợp nó với rx? – ffeast

+0

đây là giải pháp chung. Các chức năng quan sát có thể thiết lập một bộ đếm thời gian và kiểm tra giữa các nhiệm vụ nếu nó có thời gian chờ và trả về on_error. Điều này có giới hạn nêu trên, nơi xử lý tiêu thụ thời gian chờ/chờ đợi là –

0

Sau đây là một lớp có thể được gọi bằng cách sử dụng with timeout() :

Nếu khối dưới mã chạy lâu hơn thời gian đã chỉ định, hãy tăng TimeoutError.

import signal 

class timeout: 
    # Default value is 1 second (1000ms) 
    def __init__(self, seconds=1, error_message='Timeout'): 
     self.seconds = seconds 
     self.error_message = error_message 
    def handle_timeout(self, signum, frame): 
     raise TimeoutError(self.error_message) 
    def __enter__(self): 
     signal.signal(signal.SIGALRM, self.handle_timeout) 
     signal.alarm(self.seconds) 
    def __exit__(self, type, value, traceback): 
     signal.alarm(0) 

# example usage 
with timeout() : 
    # infinite while loop so timeout is reached 
    while True : 
     pass 

Nếu tôi hiểu chức năng của bạn, đây là những gì thực hiện của bạn sẽ trông như thế:

def intns(x): 
    y = random.randint(5,10) 
    print(y) 
    print('begin') 
    with timeout() : 
     time.sleep(y) 
    print('end') 
    return x 
0

Bạn có thể sử dụng time.sleep() và thực hiện một vòng lặp trong khi đối với thời gian.clock()

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