not runnable due to timeout with too many clients

This commit is contained in:
Askill 2022-05-28 16:12:56 +02:00
parent 662340f5f7
commit 7be7496944
2 changed files with 40 additions and 21 deletions

View File

@ -5,6 +5,7 @@ import (
"flag" "flag"
"log" "log"
"net/http" "net/http"
"sync"
"time" "time"
"github.com/gorilla/websocket" "github.com/gorilla/websocket"
@ -15,17 +16,18 @@ var upgrader = websocket.Upgrader{
WriteBufferSize: 2048, WriteBufferSize: 2048,
} }
var img = GetImage(10, 10) var img = GetImage(10, 10)
var tmpImage = GetImage(img.width, img.height)
func write(ticker time.Ticker, c websocket.Conn) { func write(ticker time.Ticker, c *websocket.Conn, wg *sync.WaitGroup) {
defer wg.Done()
var tmpImage = GetImage(img.width, img.height)
for range ticker.C { for range ticker.C {
diff := tmpImage.GetDiff(&img) diff := tmpImage.GetDiff(&img)
for i := 0; i < int(diff.Width*diff.Height); i++ { for i := 0; i < int(diff.Width*diff.Height); i++ {
pix := diff.Pixels[i] pix := diff.Pixels[i]
if pix.UserID != 0 { if pix.UserID != 0 {
x := i / int(diff.Width) x := uint16(i / int(diff.Width))
y := i % int(diff.Height) y := uint16(i % int(diff.Height))
msg := Message{X: uint16(x), Y: uint16(y), Timestamp: pix.Timestamp, UserID: pix.UserID, Color: pix.Color} msg := Message{X: x, Y: y, Timestamp: pix.Timestamp, UserID: pix.UserID, Color: pix.Color}
marshalMsg, err := json.Marshal(msg) marshalMsg, err := json.Marshal(msg)
if err != nil { if err != nil {
log.Println("error while writing image", err) log.Println("error while writing image", err)
@ -38,15 +40,8 @@ func write(ticker time.Ticker, c websocket.Conn) {
} }
} }
func serve(w http.ResponseWriter, r *http.Request) { func read(c *websocket.Conn, wg *sync.WaitGroup) {
c, err := upgrader.Upgrade(w, r, nil) defer wg.Done()
if err != nil {
log.Print("error while upgrading", err)
return
}
defer c.Close()
ticker := time.NewTicker(1 * time.Second)
go write(*ticker, *c)
for { for {
_, msg, err := c.ReadMessage() _, msg, err := c.ReadMessage()
if err != nil { if err != nil {
@ -58,7 +53,23 @@ func serve(w http.ResponseWriter, r *http.Request) {
message.JsonToStruct(msg) message.JsonToStruct(msg)
img.SetPixel(message) img.SetPixel(message)
} }
}
func serve(w http.ResponseWriter, r *http.Request) {
c, err := upgrader.Upgrade(w, r, nil)
if err != nil {
log.Print("error while upgrading", err)
return
}
defer c.Close()
ticker := time.NewTicker(1 * time.Second)
var wg sync.WaitGroup
// end fucntion if either of the 2 functions is done
wg.Add(1)
go write(*ticker, c, &wg)
go read(c, &wg)
wg.Wait()
} }
func main() { func main() {

View File

@ -19,10 +19,9 @@ class pixel:
timestamp: int timestamp: int
userid: int userid: int
async def sender():
async def main():
async with websockets.connect("ws://localhost:8080/") as websocket: async with websockets.connect("ws://localhost:8080/") as websocket:
for _ in range(10): while True:
message = pixel( message = pixel(
x=random.randint(0, 9), x=random.randint(0, 9),
y=random.randint(0, 9), y=random.randint(0, 9),
@ -30,12 +29,21 @@ async def main():
timestamp=int(time.time()), timestamp=int(time.time()),
userid=1, userid=1,
) )
print(message)
await websocket.send(json.dumps(message.__dict__)) await websocket.send(json.dumps(message.__dict__))
while True: await asyncio.sleep(0.1)
x = await websocket.recv()
print(x)
async def client():
async with websockets.connect("ws://localhost:8080/") as websocket:
i= 0
while True:
i+=1
x = await websocket.recv()
print(i, pixel(**json.loads(x)))
async def main():
coros = [sender() for _ in range(100)]
coros.append(client())
returns = await asyncio.gather(*coros)
if __name__ == "__main__": if __name__ == "__main__":
asyncio.get_event_loop().run_until_complete(main()) asyncio.get_event_loop().run_until_complete(main())