[racket] web server + REPL-ish functions?

From: Jay McCarthy (jay.mccarthy at gmail.com)
Date: Fri Aug 29 06:44:44 EDT 2014

Racket would definitely be 'load-balancing', but I'd be surprised if
that would affect performance because the REPL thread should just be
blocked on input. I'd be worried that the way the REPL was started ran
the server without the JIT.

Jay

On Thu, Aug 28, 2014 at 7:40 PM, Matthew Butterick <mb at mbtype.com> wrote:
> To implement your suggestion, I tried starting the web server from the real REPL by making `raco pollen start` invoke a system command along these lines:
>
> racket -i -l pollen/server -e '(define t (thread (lambda () (start-server))))'
>
> This works — the web server responds properly, and the REPL stays active.
>
> The problem is that when invoked this way, the web server seems to get a lot slower. Is that the expected behavior, since Racket is "load balancing" between the two threads? Or should it not matter? Or is this not the way to go about it?
>
>
>
>
> On Aug 28, 2014, at 7:45 AM, Matthew Butterick <mb at mbtype.com> wrote:
>
>> Maybe starting the server from the REPL is the better idea. Right now I do it through raco (redirecting commands of form `raco pollen ...`, including `raco pollen start`, to a special pollen/raco module that handles them)
>>
>>
>> On Aug 27, 2014, at 3:12 PM, Jay McCarthy <jay.mccarthy at gmail.com> wrote:
>>
>>> Yes, although I actually assumed that you would start your server from
>>> a real Racket REPL, rather than implement your own REPL, so you
>>> wouldn't need to wait on anything. But what you wrote will work too.
>>>
>>> Jay
>>>
>>> On Wed, Aug 27, 2014 at 4:33 PM, Matthew Butterick <mb at mbtype.com> wrote:
>>>> Helpful, thanks. I have my `serve/servlet` within a `start-server` function rather than at the top level. Quick experimentation suggests that `thread-wait` is needed in this case (?):
>>>>
>>>> (define (start-server)
>>>>   (setup-chores ...)
>>>>   (define server-t (thread (lambda () (serve/servlet ...))))
>>>>   (define repl-t (thread (lambda () ...)))
>>>>   (thread-wait server-t))
>>>>
>>>> Otherwise, I'll see how far I get.
>>>>
>>>>
>>>>
>>>> On Aug 27, 2014, at 10:58 AM, Jay McCarthy <jay.mccarthy at gmail.com> wrote:
>>>>
>>>>> Hi Matthew,
>>>>>
>>>>> You can run serve/servlet in a separate thread and continue to
>>>>> interact with any functions you want:
>>>>>
>>>>> (define server-t (thread (lambda () (serve/servlet ...))))
>>>>>
>>>>> You could then use something like xrepl to start doing new stuff.
>>>>> There's nothing the Web server would need to do necessarily.
>>>>>
>>>>> However, if you wanted to change how the server was running, you might
>>>>> need to adjust some things. For instance, you could put the main
>>>>> request->response function in a box that you could change. You could
>>>>> kill the server-t thread and then create another one to restart the
>>>>> server with new parameters.
>>>>>
>>>>> Is that a useful sketch?
>>>>>
>>>>> Jay
>>>>>
>>>>>
>>>>> On Wed, Aug 27, 2014 at 1:33 PM, Matthew Butterick <mb at mbtype.com> wrote:
>>>>>> The main engine of my Pollen system is a project webserver that's started from the command line, uses serve/servlet, and sends the usual status & error messages to the terminal window.
>>>>>>
>>>>>> I was thinking it would be handy to be able to keep an input prompt in that terminal window to be able to issue commands without stopping the server, switching to another window, etc.
>>>>>>
>>>>>> Is there a straightforward approach to this in terms of program design, or would it introduce annoying complications?
>>>>>>
>>>>>> My understanding of serve/servlet is that it can only do one thing, which is listen & respond to TCP requests on a certain port. So for this REPL-ish feature, there would have to be a separate listenener/response mechanism. Is that something one would accomplish with threads? Or is there a better way? (Or no way.)
>>>>>>
>>>>>> An approach I've seen with other web-development systems is to put an admin panel in the browser (by injecting it into the HTML of the output web page). But that's inherently hinky because it pollutes your output.
>>>>>> ____________________
>>>>>> Racket Users list:
>>>>>> http://lists.racket-lang.org/users
>>>>>
>>>>>
>>>>>
>>>>> --
>>>>> Jay McCarthy
>>>>> http://jeapostrophe.github.io
>>>>>
>>>>>         "Wherefore, be not weary in well-doing,
>>>>>    for ye are laying the foundation of a great work.
>>>>> And out of small things proceedeth that which is great."
>>>>>                        - D&C 64:33
>>>>
>>>>
>>>> ____________________
>>>> Racket Users list:
>>>> http://lists.racket-lang.org/users
>>>
>>>
>>>
>>> --
>>> Jay McCarthy
>>> http://jeapostrophe.github.io
>>>
>>>          "Wherefore, be not weary in well-doing,
>>>     for ye are laying the foundation of a great work.
>>> And out of small things proceedeth that which is great."
>>>                         - D&C 64:33
>>
>
>
> ____________________
>   Racket Users list:
>   http://lists.racket-lang.org/users



-- 
Jay McCarthy
http://jeapostrophe.github.io

           "Wherefore, be not weary in well-doing,
      for ye are laying the foundation of a great work.
And out of small things proceedeth that which is great."
                          - D&C 64:33


Posted on the users mailing list.