~ubuntu-branches/ubuntu/karmic/pypy/karmic

« back to all changes in this revision

Viewing changes to pypy/lib/distributed/socklayer.py

  • Committer: Bazaar Package Importer
  • Author(s): Alexandre Fayolle
  • Date: 2007-04-13 09:33:09 UTC
  • Revision ID: james.westby@ubuntu.com-20070413093309-yoojh4jcoocu2krz
Tags: upstream-1.0.0
ImportĀ upstreamĀ versionĀ 1.0.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
 
 
2
import py
 
3
from socket import socket
 
4
from py.__.green.msgstruct import decodemessage, message
 
5
from socket import socket, AF_INET, SOCK_STREAM
 
6
import marshal
 
7
import sys
 
8
 
 
9
TRACE = False
 
10
def trace(msg):
 
11
    if TRACE:
 
12
        print >>sys.stderr, msg
 
13
 
 
14
class SocketWrapper(object):
 
15
    def __init__(self, conn):
 
16
        self.buffer = ""
 
17
        self.conn = conn
 
18
 
 
19
    def receive(self):
 
20
        msg, self.buffer = decodemessage(self.buffer)
 
21
        while msg is None:
 
22
            self.buffer += self.conn.recv(8192)
 
23
            msg, self.buffer = decodemessage(self.buffer)
 
24
        assert msg[0] == 'c'
 
25
        trace("received %s" % msg[1])
 
26
        return marshal.loads(msg[1])
 
27
 
 
28
    def send(self, data):
 
29
        trace("sending %s" % (data,))
 
30
        self.conn.sendall(message('c', marshal.dumps(data)))
 
31
        trace("done")
 
32
 
 
33
def socket_listener(address=('', 12122), socket=socket):
 
34
    s = socket(AF_INET, SOCK_STREAM)
 
35
    s.bind(address)
 
36
    s.listen(1)
 
37
    print "Waiting for connection"
 
38
    conn, addr = s.accept()
 
39
 
 
40
    sw = SocketWrapper(conn)
 
41
    return sw.send, sw.receive
 
42
 
 
43
def socket_connecter(address, socket=socket):
 
44
    s = socket(AF_INET, SOCK_STREAM)
 
45
    print "Connecting %s" % (address,)
 
46
    s.connect(address)
 
47
 
 
48
    sw = SocketWrapper(s)
 
49
    return sw.send, sw.receive
 
50
 
 
51
def spawn_remote_side(code, gw):
 
52
    """ A very simple wrapper around greenexecnet to allow
 
53
    spawning a remote side of lib/distributed
 
54
    """
 
55
    from distributed import RemoteProtocol
 
56
    extra = str(py.code.Source("""
 
57
    from distributed import remote_loop, RemoteProtocol
 
58
    remote_loop(RemoteProtocol(channel.send, channel.receive, globals()))
 
59
    """))
 
60
    channel = gw.remote_exec(code + "\n" + extra)
 
61
    return RemoteProtocol(channel.send, channel.receive)