Use new threaded-server features in concurrency.distributed
							parent
							
								
									8aa22487da
								
							
						
					
					
						commit
						f20ee7a53b
					
				| 
						 | 
				
			
			@ -1,22 +1,9 @@
 | 
			
		|||
USING: help.markup help.syntax concurrency.messaging threads ;
 | 
			
		||||
IN: concurrency.distributed
 | 
			
		||||
 | 
			
		||||
HELP: local-node
 | 
			
		||||
{ $var-description "A variable containing the node the current thread is running on." } ;
 | 
			
		||||
 | 
			
		||||
HELP: start-node
 | 
			
		||||
{ $values { "port" "a port number between 0 and 65535" } { "threaded-server" "a threaded-server tuple" } }
 | 
			
		||||
{ $description "Starts a node server for receiving messages from remote Factor instances." } ;
 | 
			
		||||
 | 
			
		||||
ARTICLE: "concurrency.distributed.example" "Distributed Concurrency Example"
 | 
			
		||||
"For a Factor instance to be able to send and receive distributed "
 | 
			
		||||
"concurrency messages it must first have " { $link start-node } " called."
 | 
			
		||||
$nl
 | 
			
		||||
"In one factor instance call " { $link start-node } " with the port 9000, "
 | 
			
		||||
"and in another with the port 9001."
 | 
			
		||||
$nl
 | 
			
		||||
"In this example the Factor instance associated with port 9000 will run "
 | 
			
		||||
"a thread that sits receiving messages and printing the received message "
 | 
			
		||||
"a thread that receives and prints messages "
 | 
			
		||||
"in the listener. The code to start the thread is: "
 | 
			
		||||
{ $examples
 | 
			
		||||
    { $unchecked-example
 | 
			
		||||
| 
						 | 
				
			
			@ -51,11 +38,9 @@ $nl
 | 
			
		|||
 | 
			
		||||
ARTICLE: "concurrency.distributed" "Distributed message passing"
 | 
			
		||||
"The " { $vocab-link "concurrency.distributed" } " implements transparent distributed message passing, inspired by Erlang and Termite."
 | 
			
		||||
{ $subsections start-node }
 | 
			
		||||
"Instances of " { $link thread } " can be sent to remote threads, at which point they are converted to objects holding the thread ID and the current node's host name:"
 | 
			
		||||
{ $subsections remote-thread }
 | 
			
		||||
"The " { $vocab-link "serialize" } " vocabulary is used to convert Factor objects to byte arrays for transfer over a socket." 
 | 
			
		||||
{ $subsections "concurrency.distributed.example" } ;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
ABOUT: "concurrency.distributed"
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,33 +1,39 @@
 | 
			
		|||
USING: tools.test concurrency.distributed kernel io.files
 | 
			
		||||
io.files.temp io.directories arrays io.sockets system
 | 
			
		||||
io.files.temp io.directories arrays io.sockets system calendar
 | 
			
		||||
combinators threads math sequences concurrency.messaging
 | 
			
		||||
continuations accessors prettyprint ;
 | 
			
		||||
continuations accessors prettyprint io.servers.connection ;
 | 
			
		||||
FROM: concurrency.messaging => receive send ;
 | 
			
		||||
IN: concurrency.distributed.tests
 | 
			
		||||
 | 
			
		||||
: test-node ( -- addrspec )
 | 
			
		||||
CONSTANT: test-ip "127.0.0.1"
 | 
			
		||||
 | 
			
		||||
: test-node-server ( -- threaded-server )
 | 
			
		||||
    {
 | 
			
		||||
        { [ os unix? ] [ "distributed-concurrency-test" temp-file <local> ] }
 | 
			
		||||
        { [ os windows? ] [ "127.0.0.1" 1238 <inet4> ] }
 | 
			
		||||
        { [ os windows? ] [ test-ip 0 <inet4> ] }
 | 
			
		||||
    } cond <node-server> ;
 | 
			
		||||
 | 
			
		||||
: test-node-client ( -- addrspec )
 | 
			
		||||
    {
 | 
			
		||||
        { [ os unix? ] [ "distributed-concurrency-test" temp-file <local> ] }
 | 
			
		||||
        { [ os windows? ] [ test-ip insecure-port <inet4> ] }
 | 
			
		||||
    } cond ;
 | 
			
		||||
 | 
			
		||||
    
 | 
			
		||||
[ ] [ [ "distributed-concurrency-test" temp-file delete-file ] ignore-errors ] unit-test
 | 
			
		||||
 | 
			
		||||
[ ] [ test-node dup (start-node) drop ] unit-test
 | 
			
		||||
test-node-server [
 | 
			
		||||
    [ ] [
 | 
			
		||||
        [
 | 
			
		||||
            receive first2 [ 3 + ] dip send
 | 
			
		||||
            "thread-a" unregister-remote-thread
 | 
			
		||||
        ] "Thread A" spawn
 | 
			
		||||
        "thread-a" register-remote-thread
 | 
			
		||||
    ] unit-test
 | 
			
		||||
 | 
			
		||||
[ ] [
 | 
			
		||||
    [
 | 
			
		||||
        receive first2 [ 3 + ] dip send
 | 
			
		||||
        "thread-a" unregister-remote-thread
 | 
			
		||||
    ] "Thread A" spawn
 | 
			
		||||
    "thread-a" register-remote-thread
 | 
			
		||||
] unit-test
 | 
			
		||||
 | 
			
		||||
[ 8 ] [
 | 
			
		||||
    5 self 2array
 | 
			
		||||
    test-node "thread-a" <remote-thread> send
 | 
			
		||||
 | 
			
		||||
    receive
 | 
			
		||||
] unit-test
 | 
			
		||||
 | 
			
		||||
[ ] [ test-node stop-node ] unit-test
 | 
			
		||||
    [ 8 ] [
 | 
			
		||||
        5 self 2array
 | 
			
		||||
        test-node-client "thread-a" <remote-thread> send
 | 
			
		||||
        100 seconds receive-timeout
 | 
			
		||||
    ] unit-test
 | 
			
		||||
] with-threaded-server
 | 
			
		||||
| 
						 | 
				
			
			@ -22,8 +22,6 @@ PRIVATE>
 | 
			
		|||
: get-remote-thread ( name -- thread )
 | 
			
		||||
    dup registered-remote-threads at [ ] [ threads at ] ?if ;
 | 
			
		||||
 | 
			
		||||
SYMBOL: local-node
 | 
			
		||||
 | 
			
		||||
: handle-node-client ( -- )
 | 
			
		||||
    deserialize
 | 
			
		||||
    [ first2 get-remote-thread send ] [ stop-this-server ] if* ;
 | 
			
		||||
| 
						 | 
				
			
			@ -34,12 +32,6 @@ SYMBOL: local-node
 | 
			
		|||
        "concurrency.distributed" >>name
 | 
			
		||||
        [ handle-node-client ] >>handler ;
 | 
			
		||||
 | 
			
		||||
: (start-node) ( addrspec addrspec -- threaded-server )
 | 
			
		||||
    local-node set-global <node-server> start-server ;
 | 
			
		||||
 | 
			
		||||
: start-node ( port -- threaded-server )
 | 
			
		||||
    host-name over <inet> (start-node) ;
 | 
			
		||||
 | 
			
		||||
TUPLE: remote-thread node id ;
 | 
			
		||||
 | 
			
		||||
C: <remote-thread> remote-thread
 | 
			
		||||
| 
						 | 
				
			
			@ -52,8 +44,7 @@ M: remote-thread send ( message thread -- )
 | 
			
		|||
    send-remote-message ;
 | 
			
		||||
 | 
			
		||||
M: thread (serialize) ( obj -- )
 | 
			
		||||
    id>> [ local-node get-global ] dip <remote-thread>
 | 
			
		||||
    (serialize) ;
 | 
			
		||||
    id>> [ insecure-addr ] dip <remote-thread> (serialize) ;
 | 
			
		||||
 | 
			
		||||
: stop-node ( node -- )
 | 
			
		||||
    f swap send-remote-message ;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue