Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Done UnityClient Runtime, Unity Code Generator
  • Loading branch information
neuecc committed Dec 15, 2016
1 parent 4e213fc commit 82118bc
Show file tree
Hide file tree
Showing 210 changed files with 6,525 additions and 759 deletions.
29 changes: 18 additions & 11 deletions sandbox/Sandbox.ConsoleClient/Program.cs
Expand Up @@ -3,9 +3,12 @@
using MagicOnion.Client;
using Sandbox.ConsoleServer;
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace MagicOnion.ConsoleClient
Expand All @@ -16,7 +19,7 @@ static void Main(string[] args)
{
Console.WriteLine("Client:::");

Environment.SetEnvironmentVariable("GRPC_TRACE", "all");
//Environment.SetEnvironmentVariable("GRPC_TRACE", "all");
GrpcEnvironment.SetLogger(new ConsoleLogger());

var channel = new Channel("localhost", 12345, ChannelCredentials.Insecure);
Expand All @@ -29,7 +32,7 @@ static void Main(string[] args)
DuplexStreamRun(c).GetAwaiter().GetResult();

// many run
// UnaryDoDoDoRun(c).GetAwaiter().GetResult();
// UnaryLoadTest(c).GetAwaiter().GetResult();
}

static async Task UnaryRun(IMyFirstService client)
Expand All @@ -48,17 +51,21 @@ static async Task UnaryRun(IMyFirstService client)
}
}

static async Task UnaryDoDoDoRun(IMyFirstService client)
static async Task UnaryLoadTest(IMyFirstService client)
{
List<Task> t = new List<Task>();
Parallel.For(0, 100, x =>
{
lock (t)
{
t.Add(client.SumAsync(x, x).ContinueWith(y => y.Result.ResponseAsync).Unwrap());
}
});
ThreadPool.SetMinThreads(1000, 1000);
var sw = Stopwatch.StartNew();
ConcurrentQueue<Task> t = new ConcurrentQueue<Task>();
Parallel.For(0, 10000, new ParallelOptions { MaxDegreeOfParallelism = 300 }, x =>
{
t.Enqueue(client.SumAsync(x, x).ContinueWith(y => y.Result.ResponseAsync).Unwrap());
});
await Task.WhenAll(t);
sw.Stop();
Console.WriteLine(sw.Elapsed.TotalMilliseconds + "ms"); // 10000request, x-ms
var one = sw.Elapsed.TotalMilliseconds / 10000; // 1request, ms
Console.WriteLine(one);
Console.WriteLine((1000.0 / one) + "req per/sec");
}

static async Task ClientStreamRun(IMyFirstService client)
Expand Down
4 changes: 2 additions & 2 deletions sandbox/Sandbox.ConsoleServer/Program.cs
Expand Up @@ -11,8 +11,8 @@ static void Main(string[] args)
{
Console.WriteLine("Server:::");

Environment.SetEnvironmentVariable("GRPC_VERBOSITY", "DEBUG");
Environment.SetEnvironmentVariable("GRPC_TRACE", "all");
//Environment.SetEnvironmentVariable("GRPC_VERBOSITY", "DEBUG");
//Environment.SetEnvironmentVariable("GRPC_TRACE", "all");
GrpcEnvironment.SetLogger(new ConsoleLogger());

var service = MagicOnionEngine.BuildServerServiceDefinition(new MagicOnionOptions(true)
Expand Down
2 changes: 1 addition & 1 deletion sandbox/Sandbox.ConsoleServerDefinition/IMyFirstService.cs
Expand Up @@ -14,7 +14,7 @@ public interface IMyFirstService : IService<IMyFirstService>

Task<ClientStreamingResult<int, string>> StreamingOne();
Task<ServerStreamingResult<string>> StreamingTwo(int x, int y, int z);
ServerStreamingResult<string> StreamingTwo2(int x, int y, int z);
ServerStreamingResult<string> StreamingTwo2(int x, int y, int z = 9999);

Task<DuplexStreamingResult<int, string>> StreamingThree();
}
Expand Down
9 changes: 9 additions & 0 deletions src/MagicOnion.Client.Unity/Assets/Plugins/ZeroFormatter.meta

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Binary file not shown.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Binary file not shown.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

This file was deleted.

2 changes: 1 addition & 1 deletion src/MagicOnion.Client.Unity/Assets/Scripts/Loader.cs
Expand Up @@ -2,7 +2,7 @@
using UnityEngine;
using System.Collections;

namespace MagicOinon.Tests
namespace MagicOnion.Tests
{
public static class UnitTestLoader
{
Expand Down
@@ -0,0 +1,62 @@
using Grpc.Core;
using System;
using UniRx;

namespace MagicOnion
{
public static class AsyncStreamReaderExtensions
{
//TODO:implement Observbale.While
public static IObservable<Unit> ForEachAsync<T>(this IAsyncStreamReader<T> stream, Action<T> action)
{
return RecursiveAction(stream, action);
}

static IObservable<Unit> RecursiveAction<T>(IAsyncStreamReader<T> stream, Action<T> action)
{
return stream.MoveNext().ContinueWith(x =>
{
if (x)
{
action(stream.Current);
return RecursiveAction(stream, action);
}
else
{
stream.Dispose();
return Observable.ReturnUnit();
}
});
}

public static IObservable<Unit> ForEachAsync<T>(this IAsyncStreamReader<T> stream, Func<T, IObservable<Unit>> asyncAction)
{
return RecursiveActionAsync(stream, asyncAction);
}

static IObservable<Unit> RecursiveActionAsync<T>(IAsyncStreamReader<T> stream, Func<T, IObservable<Unit>> asyncAction)
{
return stream.MoveNext().ContinueWith(x =>
{
if (x)
{
return asyncAction(stream.Current)
.ContinueWith(_ => RecursiveActionAsync(stream, asyncAction));
}
else
{
stream.Dispose();
return Observable.ReturnUnit();
}
});
}

// TODO:needs strict implementation
public static IObservable<T> AsObservable<T>(this IAsyncStreamReader<T> stream)
{
var subject = new Subject<T>();
stream.ForEachAsync(x => subject.OnNext(x)); // cancellation!
return subject;
}
}
}

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

@@ -0,0 +1,44 @@
using Grpc.Core;
using System;
using ZeroFormatter.Formatters;

namespace MagicOnion.Client
{
public static class MagicOnionClient
{
public static T Create<T>(Channel channel)
where T : IService<T>
{
return MagicOnionClientRegistry<T>.Create(channel);
}

public static T Create<T>(CallInvoker invoker)
where T : IService<T>
{
return MagicOnionClientRegistry<T>.Create(invoker);
}
}

public static class MagicOnionClientRegistry<T>
where T : IService<T>
{
static Func<Channel, T> consturtor1;
static Func<CallInvoker, T> consturtor2;

public static void Register(Func<Channel, T> ctor1, Func<CallInvoker, T> ctor2)
{
consturtor1 = ctor1;
consturtor2 = ctor2;
}

public static T Create(Channel channel)
{
return consturtor1(channel);
}

public static T Create(CallInvoker invoker)
{
return consturtor2(invoker);
}
}
}

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

0 comments on commit 82118bc

Please sign in to comment.