Multithreading en Photon

Sobre qu茅 es el art铆culo

En este art铆culo, hablaremos sobre el subproceso m煤ltiple del lado del servidor.





  • como se implementa





  • como se usa





  • Qu茅 se puede hacer





  • lo que nosotros mismos inventamos





Todas estas preguntas son relevantes solo si est谩 desarrollando algo directamente para el lado del servidor: modificando el c贸digo SDK, escribiendo su propio complemento o incluso haciendo algo por su cuenta.





驴C贸mo maneja Photon el multihilo?

La aplicaci贸n del servidor de fotones acepta solicitudes de m煤ltiples conexiones de clientes. Llamar茅 compa帽eros a tales conexiones . Estas solicitudes forman colas. Uno para cada fiesta. Si los compa帽eros est谩n conectados a la misma sala, sus colas se combinan en una: la cola de la sala. Hay hasta varios miles de salas de este tipo y sus colas de solicitudes tambi茅n se procesan en paralelo.





Como base para la implementaci贸n de las colas de tareas en Photon, se tom贸 la biblioteca retlang, que se desarroll贸 sobre la base de la biblioteca Jetlang.





驴Por qu茅 no usar Task y async / await?

Por lo tanto, existen las siguientes consideraciones:





  1. Photon comenz贸 a desarrollarse antes de que aparecieran estas cosas.





  2. , , - . , , , GC , . , .





  3. TaskScheduler, , - .





Fiber?

, . - FIFO. , multiple writers-single reader. , , , .. . .





Photon , PoolFiber, . IFiber. .





  • ThreadFiber - IFiber, . .





  • PoolFiber - IFiber, .NET. . . ( ).





  • FormFiber/DispatchFiber - IFiber, WinForms/WPF. FormFiber/DispatchFiber Invoke BeginInvoke .





  • StubFiber - . , (races) . .





PoolFiber

PoolFiber. , . :





  1. . ThreadPool.QueueUserWorkItem. - .





  2. , , ThreadPool.QueueUserWorkItem, . . , .





.. , , . , , () . - , , .





PoolFiber

Photon PoolFiber. , . , , . .. PoolFiber.Stop . .





. -. , , , .





:









  • ,





  • , .





:





//    
fiber.Enqueue(()=>{some action code;});

      
      



//    ,    10 
var scheduledAction = fiber.Schedule(()=>{some action code;}, 10_000);
...
//  
scheduledAction.Dispose()

      
      



//    ,    10    5
var scheduledAction = fiber.Schedule(()=>{some action code;}, 10_000, 5_000);
...
//  
scheduledAction.Dispose()

      
      



, - , fiber.Schedule. .





Executors

. , . Execute(Action a)



Execute(List<Action> a)



. PoolFiber . .. . . DefaultExecutor. :





        public void Execute(List<Action> toExecute)
        {
            foreach (var action in toExecute)
            {
                Execute(action);
            }
        }

        public void Execute(Action toExecute)
        {
            if (_running)
            {
                toExecute();
            }
        }

      
      



. 'action' toExecute . FailSafeBatchExecutor, try/catch. , . , , github.





BeforeAfterExecutor

, . BeforeAfterExecutor. "" . , FailSafeBatchExecutor. BeforeAfterExecutor . :





public BeforeAfterExecutor(Action beforeExecute, Action afterExecute, IExecutor executor = null)

      
      



. . . / , , . , .





:






var beforeAction = ()=>
{
  log4net.ThreadContext.Properties["Meta1"] = "value";
};

var afterAction = () => ThreadContext.Properties.Clear();

// 
var e = new BeforeAfterExecutor(beforeAction, afterAction);

// PoolFiber
var fiber = new PoolFiber(e);

      
      



- , fiber, log4net Meta1 value.





ExtendedPoolFiber ExtendedFailSafeExecutor

, retlang, . . , . . PoolFiber ( , .NET). , , HTTP . :





  1. event;





  2. , , , , event ;





  3. event.





. , , , , event. . . , .





ExtendedPoolFiber ExtendedFailSafeExecutor. . , . , Pause. ( ) . :





  1. Resume





  2. ( Pause) Resume , , .





, , HTTP . , . Resume , .





, ThreadFiber .





IFiberAction

IFiberAction - GC. .NET. , IFiberAction. , . GC





IFiberAction :





public interface IFiberAction
{
    void Execute()
    void Return()
}
      
      



Execute , . Return Execute, .





:





public class PeerHandleRequestAction : IFiberAction
{
    public static readonly ObjectPool<PeerHandleRequestAction> Pool = initialization;
    public OperationRequest Request {get; set;}
    public PhotonPeer Peer {get; set;}
    
    public void Execute()
    {
        this.Peer.HandleRequest(this.Request);
    }
    
    public void Return()
    {
        this.Peer = null;
        this.Request = null;
        
        Pool.Return(this);
    }
}

//     

var action = PeerHandleRequestAction.Pool.Get();
action.Peer = peer;
action.Request = request;

peer.Fiber.Enqueue(action);

      
      



, . , . , PoolFiber . PoolFiber .NET. PoolFiber , . , ExtendedPoolFiber.





Los ejecutores que implementan la interfaz IExecutor est谩n directamente involucrados en la ejecuci贸n de tareas en fibras . DefaultExecutor es bueno para todos, pero en caso de una excepci贸n, pierde todo el resto de las tareas que se le transfirieron para su ejecuci贸n. FailSafeExecutor parece ser una opci贸n inteligente en este sentido . Si necesita realizar alguna acci贸n antes y despu茅s de la ejecuci贸n de un lote de tareas por parte del ejecutor, BeforeAfterExecutor puede resultar 煤til








All Articles