Thread overview
ZMQD ile Prosesler arası iletişim
Jun 22, 2018
kerdemdemir
Jun 22, 2018
kerdemdemir
June 22, 2018

Merhabalar,

Vibe.d 'deki bir bugdan dolayı nerdeyse 1 aydır tıkandım kaldım. Bir programda 2 tane web-socket açılamıyor. Vibe.d 'e bildirmeme rağmen 1 aydır cevap alamadığım için her bir açacağım socket için bir proses yaratmaya ve sonra bu prosesden ZMQD ile cevap almaya karar verdim .

Kod ise şöyle birşey :

Benim büyük projem şu aşağıdaki minimal örnekte olduğu gibi bir sürü proses oluşturacak:


Socket*[] socketList;

string sRecv( Socket* socket)
{
   ubyte[256] buffer;
   immutable size = socket.receive(buffer);
   import std.algorithm: min;
   return buffer[0 .. min(size,256)].idup.asString();
}

void startServer( string servername )
{
	auto pid = spawnProcess(["/home/erdem/eclipse-workspace/WebSocketDenemesi/websocketdenemesi", servername]);
   auto requester = new Socket(SocketType.req);
   auto allName = "ipc:///tmp/" ~  servername;
   requester.connect(allName);
   socketList ~= requester;

}

void main() {

	startServer("btcethtrade");
	startServer("btciotadepth");
	startServer("btciotatrade");

   for (int requestNbr = 0; requestNbr != 10; ++requestNbr) {
   	foreach ( requester; socketList)
   	{
	        requester.send("Hello");
   	}

   	foreach ( requester; socketList)
   	{
	        auto str = sRecv(requester);
		    writefln("Received reply %d [%s]", requestNbr, str);
   	}
   }
}


Ve oluşturulan bir sürü küçük proseslerde şunun gibi olacaklar:


string sRecv(ref Socket socket)
{
   ubyte[256] buffer;
   immutable size = socket.receive(buffer);
   import std.algorithm: min;
   return buffer[0 .. min(size,256)].idup.asString();
}

void main( string[] args ) {

   auto responder = Socket(SocketType.rep);
   string temp = "ipc:///tmp/" ~ args[1];
   responder.bind(temp);

   while (true) {
       ubyte[10] buffer;
       responder.receive(buffer);
       writeln(args[1], " Received Hello");
       Thread.sleep(1.seconds);
       string message = "World from " ~ args[1];
       responder.send(message);
   }

Bu kadar uzun kodlardan sonra soruma geliyim.
Ben Prosesler arası iletişim olayını pek bilmediğimden düz aşağıda görülebileceği gibi request-responce socketlerini kullandım.

   for (int requestNbr = 0; requestNbr != 10; ++requestNbr) {
   	foreach ( requester; socketList)
   	{
	        requester.send("Hello");
   	}

   	foreach ( requester; socketList)
   	{
	        auto str = sRecv(requester);
		    writefln("Received reply %d [%s]", requestNbr, str);
   	}
   }

Biraz ZMQ okuyorumda daha bir sürü method varmış halbuki "Broker, Dealer" filan. Çalışıyor ama acaba yöntemimde ölümcül bir hata varmı? Çok az çaba gerektirecek güzelleştirmeler olabilirmiydi ? Acaba hangi prosesler arası iletişim method'u benim için doğru olurdu?

Erdemdem

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

June 22, 2018

Aslında baktım baya pipeProcess 'e filan "message queue" kütüphaneleri biraz karışık geldiğinden.

Benim kendi kafamda pipeProcess işini eleme sebebim şu oldu ana program bir sürü iş yapıyor ve saniye sadece 1 defa küçük programcıkları dinliyor. Bunun dışında onlarla ilgilenecek vakti olmuyor.

Bu nedenle saniyede bir defa bu küçük parçaçıklara request - responce şeklinde soru-cevap almayı planlıyorum.

Eğer pipeProcess yapsa idim sürekli dinlemek sorunda kalacakmışım iş daha karışıklaşacakmış gibi gelmişti.

Erdem

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

June 22, 2018

ZMQ konusunda yardımım olamaz.

Gösterdiğin programlar güzel.

Eğer mesajları standart girişten okumak (örneğin stdin.byLineCopy ile) mantıklı ise programları belki pipeProcess ile de başlatabilirsin. (Kendim denemedim; yalnızca bir fikir...)

https://dlang.org/phobos/std_process.html#.pipeProcess

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]