Changeset 4903:008cf60987da


Ignore:
Timestamp:
06/08/07 02:17:35 (6 years ago)
Author:
William Stein <wstein@…>
Branch:
default
Message:

Twisted notebook -- implemented interrupt/restart less blocking (hence server is more robust).

Location:
sage
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • sage/interfaces/expect.py

    r4554 r4903  
    355355        raise NotImplementedError 
    356356 
    357     def quit(self, verbose=False): 
     357    def quit(self, verbose=False, timeout=0.25): 
    358358        """ 
    359359        EXAMPLES: 
     
    377377        try: 
    378378            E.sendline(self._quit_string()) 
    379             self._so_far(wait=0.25) 
     379            self._so_far(wait=timeout) 
    380380            os.killpg(E.pid, 9) 
    381381            os.kill(E.pid, 9) 
     
    469469            raise KeyboardInterrupt, "Ctrl-c pressed while running %s"%self 
    470470 
    471     def interrupt(self, tries=20, timeout=0.3): 
     471    def interrupt(self, tries=20, timeout=0.3, quit_on_fail=True): 
    472472        E = self._expect 
    473473        if E is None: 
     
    489489        if success: 
    490490            pass 
    491         else: 
     491        elif quit_on_fail: 
    492492            self.quit() 
    493493        return success 
  • sage/server/notebook/cell.py

    r4896 r4903  
    531531            if 'cell://%s'%F in out: 
    532532                continue 
    533             url = "/w/%s/data/%s/%s"%(self.worksheet_name(), self.relative_id(), F) 
     533            url = "/ws/%s/data/%s/%s"%(self.worksheet_name(), self.relative_id(), F) 
    534534            if F.endswith('.png') or F.endswith('.bmp'): 
    535535                images.append('<img src="%s?%d">'%(url, self.version())) 
  • sage/server/notebook/css.py

    r4902 r4903  
    597597 
    598598span.pane div.worksheet_list { 
    599    /*position:fixed;  */ 
     599   position:fixed;  
    600600   overflow:scroll; 
    601601   font-size:12px; 
  • sage/server/notebook/js.py

    r4902 r4903  
    18181818 
    18191819function interrupt_callback(status, response_text) { 
    1820     if (response_text == "restart") { 
    1821         alert("The SAGE kernel had to be restarted (your variables are no longer defined)."); 
    1822         restart_sage_callback('success', response_text); 
     1820    if (response_text == "failed") { 
     1821 
    18231822    } else if(status == "success") { 
    18241823        halt_active_cells() 
     
    18361835    link.className = "interrupt_in_progress"; 
    18371836    link.innerHTML = "Interrupt" 
    1838     async_request('/interrupt', interrupt_callback, 'worksheet_id='+worksheet_id); 
     1837    async_request(worksheet_command('interrupt'), interrupt_callback); 
    18391838} 
    18401839 
     
    19021901    link.className = "restart_sage_in_progress"; 
    19031902    link.innerHTML = "Restart"; 
    1904     async_request('/restart_sage', restart_sage_callback, 'worksheet_id='+worksheet_id); 
     1903    async_request(worksheet_command('restart_sage'), restart_sage_callback); 
    19051904} 
    19061905 
  • sage/server/notebook/twist.py

    r4902 r4903  
    5454class WorksheetResource: 
    5555    def __init__(self, worksheet_name): 
     56        self._name = worksheet_name 
    5657        self.worksheet = notebook.get_worksheet_with_name(worksheet_name) 
    5758 
     
    205206 
    206207 
    207 class Worksheet_plain(resource.Resource): 
     208class Worksheet_restart_sage(WorksheetResource, resource.Resource): 
     209    def render(self, ctx): 
     210        # TODO -- this must not block long (!) 
     211        self.worksheet.restart_sage() 
     212        return http.Response(stream='done') 
     213 
     214class Worksheet_interrupt(WorksheetResource, resource.Resource): 
     215    def render(self, ctx): 
     216        # TODO -- this must not block long (!) 
     217        s = self.worksheet.interrupt() 
     218        return http.Response(stream='ok' if s else 'failed') 
     219 
     220 
     221class Worksheet_plain(WorksheetResource, resource.Resource): 
     222    def render(self, ctx): 
     223        s = notebook.plain_text_worksheet_html(self._name) 
     224        return http.Response(stream=s) 
     225 
     226class Worksheet_print(WorksheetResource, resource.Resource): 
     227    def render(self, ctx): 
     228        s = notebook.worksheet_html(self._name) 
     229        return http.Response(stream=s) 
     230 
     231 
     232class Worksheet(resource.Resource): 
     233    addSlash = True 
     234 
    208235    def __init__(self, name): 
    209236        self._name = name 
    210          
    211     def render(self, ctx): 
    212         s = notebook.plain_text_worksheet_html(self._name) 
    213         return http.Response(stream=s) 
    214  
    215 class Worksheet_print(resource.Resource): 
    216     def __init__(self, name): 
    217         self._name = name 
    218          
    219     def render(self, ctx): 
    220         s = notebook.worksheet_html(self._name) 
    221         return http.Response(stream=s) 
    222  
    223 class Worksheet(resource.Resource): 
    224     addSlash = True 
    225  
    226     def __init__(self, name): 
    227         self._name = name 
    228237 
    229238    def render(self, ctx): 
    230239        s = notebook.html(worksheet_id = self._name) 
     240        notebook.get_worksheet_with_id(self._name).sage() 
    231241        return http.Response(stream=s) 
    232242 
  • sage/server/notebook/worksheet.py

    r4899 r4903  
    3232from cell import Cell, TextCell 
    3333 
    34 INTERRUPT_TRIES = 15 
     34INTERRUPT_TRIES = 3 
    3535 
    3636INITIAL_NUM_CELLS = 1 
     
    382382            cmd = '__DIR__="%s/"; DIR=__DIR__;'%self.DIR() 
    383383            cmd += '_support_.init("%s", globals()); '%object_directory 
    384             #S.eval(cmd) 
    385             S._send(cmd)   # so web server doesn't lock.  
     384            S._send(cmd)   # non blocking 
    386385        except Exception, msg: 
    387386            print "ERROR initializing compute process:\n" 
     
    389388            del self.__sage 
    390389            raise RuntimeError 
    391          
     390        print "Done starting" 
    392391        A = self.attached_files() 
    393392        for F in A.iterkeys(): 
     
    776775            pass 
    777776        else: 
    778             success = S.interrupt(INTERRUPT_TRIES, timeout=0.3) 
    779  
     777            success = S.interrupt(INTERRUPT_TRIES, timeout=0.3, quit_on_fail=False) 
     778 
     779        if success: 
     780            self.clear_queue() 
     781             
     782        return success 
     783 
     784    def clear_queue(self): 
    780785        # empty the queue 
    781786        for C in self.__queue: 
    782787            C.interrupt() 
    783  
    784788        self.__queue = [] 
    785789        self.__comp_is_running = False 
    786790 
    787         return success 
    788  
    789791    def restart_sage(self): 
    790792        """ 
    791793        Restart SAGE kernel. 
    792794        """ 
    793         # stop the current computation in the running SAGE 
    794         self.interrupt() 
     795        print "restarting" 
    795796 
    796797        try: 
     
    800801            return 
    801802 
    802         alarm(3) 
    803         try: 
    804             S.quit() 
     803        try: 
     804            pid = S._expect.pid 
     805            os.killpg(pid, 9) 
     806            os.kill(pid, 9) 
    805807            S._expect = None 
    806808            del self.__sage 
     
    810812            print msg 
    811813            print "WARNING: Error deleting SAGE object!" 
    812         cancel_alarm() 
    813814 
    814815        try: 
     
    818819 
    819820        # We do this to avoid getting a stale SAGE that uses old code.  
     821        self.clear_queue() 
    820822        self.__sage = initialized_sage() 
    821823        self.initialize_sage() 
    822          
    823824        self._enqueue_auto_cells() 
    824825        self.start_next_comp() 
    825  
     826         
    826827    def postprocess_output(self, out, C): 
    827828        i = out.find('\r\n') 
Note: See TracChangeset for help on using the changeset viewer.