none
MULTIPLE PROCESS RRS feed

  • Soru

  • Merhaba arkadaşlar,

    Aynı anda paralel olarak çalışacak 1000 işlem yaptırmam gerekiyor. 1000 işlemde aynı anda paralel olarak çalışacak. Thread, Task vs kullandığım zaman tüm threadlar eşit çalışmıyor. Şuan çözüm olarak her bir işlem için ayrı process(.exe) çalıştırıyorum. Bu 1000 işlemde uzun süreli işlemler belki 5 belki 10 saatlik. Ne tür bir yol izlemem gerekiyor, tecrübesi olan ve paylaşabilecek veya fikri olan var mı ? Şimdiden teşekkürler.

    13 Mayıs 2020 Çarşamba 11:18

Yanıtlar

  • Musteri ürünlerinin aktarımı neden o kadar vakit alsın anlamadım. Sanki asil yapılacak is çok çok fazla optimizasyona açık gibi. Her neyse, belki de ben yanlış anliyorumdur:

    async Task Main()
    {
    	Stopwatch sw = new Stopwatch();
    	sw.Start();
    	var tasks = new List<Task<int>>(10000);
    	for (int i = 0; i < 100; i++)
    	{
    		tasks.Add(MyTask(2000));	
    	}
    	int[] results = await Task.WhenAll(tasks);
    	sw.Stop();
    	Console.WriteLine(sw.Elapsed);
    	Console.WriteLine($"{results.Min()} - {results.Max()}");
    }
    
    Task<int> MyTask(int milliseconds) // non blocking
    {
    	Stopwatch sw = new Stopwatch();
    	sw.Start();
    	var tcs = new TaskCompletionSource<int>();
    	new Timer(_ => tcs.SetResult((int)sw.ElapsedMilliseconds)).Change(milliseconds, -1);
    	return tcs.Task;
    }


    Blog
    How to create a Minimal, Reproducible Example
    The way to Go.
    World's most advanced open source (object-) relational Database.
    Flutter (for mobile, for web & desktop.


    Not: Temelin geri zekali arkadasi Idris bu mesaja da atlayip ne kadar aptal oldugunu bir kez daha belgeleyebilir. Kendisinin tek marifeti beni takip edip, neden her soruya cevap verdigimi, yardim etmeye calistigimi sorgulamaktir. Bu beyinsiz zavalliya, aptal oldugunu hatirlatmayi unutmayiniz.

    • Yanıt Olarak İşaretleyen cblc_52 13 Mayıs 2020 Çarşamba 14:34
    13 Mayıs 2020 Çarşamba 14:23
    Yanıtlayıcı
  • Aynı CPU çekirdeğine denk gelmişlerdir bir birilerini bekliyorlardır. Bize işin doğası hakkında bilgi verseniz daha güzel cevaplar verebiliriz. Ama genellikle 3-4 thread e bölersin işleri. 


    www.cihanyakar.com

    Sistemde müşteriler var. Her müşterinin ürünlerini başka platforma aktarmam gerekiyor. Fakat her müşteri için ayrı bir iş gerekiyor. 3-4 Thread ile sıra sıra yaparsam bu işlem aylar alır. Her müşterinin kendine ait işlemi olmalı.

    Kendi bilginizi üste tutacaksanız neden soruyorsunuz?

    Forumlarda en sık yapılan hata, kişilerin sorularını değil de çözümlerini sorması oluyor. Ve asıl soruyu ancak bu cevapta alabilmeye başladık. 

    Gerçek soru şu : "Her müşterinin ürünlerini başka platforma aktarmam gerekiyor." Soru biraz eksik, Karşı platform ne?

    Karşı taraf bir veritabanı ise 1 milyon kaydı atmanız 1 dakika sürmemeli. Sürüyorsa bir dünya Insert basıyorsunuzdur.

    Karşı taraf bir web service ise o zaman bu sizin değil onların hatası. Onlar tek tek Insert basıyordur. Karşı tarafı düzeltme şansınız yoksa işlemciye uygun sayıda thread ile bu işi halletmelisiniz. TPL/Task kullandığınızda bunu .net kendisi halledecektir. (Mesaj kuyruğu ile çözmek, en uygun çözüm olabilir)

    Thread sayısı 10'u geçiyorsa bu durumda aynı process için anda açılacak TCP bağlantı limitine ulaşırsınız. Bunu da uygulamanın açılışında ServicePointManager.DefaultConnectionLimit değerini yükselterek çözebilrsiniz.


    www.cihanyakar.com




    • Düzenleyen Cihan YakarMVP 13 Mayıs 2020 Çarşamba 14:48
    • Yanıt Olarak İşaretleyen cblc_52 13 Mayıs 2020 Çarşamba 14:51
    13 Mayıs 2020 Çarşamba 14:45

Tüm Yanıtlar

  • Thread, Task kullandigimda tum threader esit calismiyor demissiniz, nasil bir eşitlik bekliyorsunuz? 1000 CPU cekirdegi olan bir makineniz yoksa, düşündüğünüz eşitlik sağlanamaz herhalde. 

    5-10 saat surecek olan islemler belki de optimize edilirse daha kısa surecektir.



    Blog
    How to create a Minimal, Reproducible Example
    The way to Go.
    World's most advanced open source (object-) relational Database.
    Flutter (for mobile, for web & desktop.


    Not: Temelin geri zekali arkadasi Idris bu mesaja da atlayip ne kadar aptal oldugunu bir kez daha belgeleyebilir. Kendisinin tek marifeti beni takip edip, neden her soruya cevap verdigimi, yardim etmeye calistigimi sorgulamaktir. Bu beyinsiz zavalliya, aptal oldugunu hatirlatmayi unutmayiniz.

    13 Mayıs 2020 Çarşamba 12:11
    Yanıtlayıcı
  • Merhaba arkadaşlar,

    Aynı anda paralel olarak çalışacak 1000 işlem yaptırmam gerekiyor. 1000 işlemde aynı anda paralel olarak çalışacak. Thread, Task vs kullandığım zaman tüm threadlar eşit çalışmıyor. Şuan çözüm olarak her bir işlem için ayrı process(.exe) çalıştırıyorum. Bu 1000 işlemde uzun süreli işlemler belki 5 belki 10 saatlik. Ne tür bir yol izlemem gerekiyor, tecrübesi olan ve paylaşabilecek veya fikri olan var mı ? Şimdiden teşekkürler.

    Yapılan işi bilmeden bir şey demek mümkün değil. Ama 1000 işin var diye 1000thread/process açmak çoğu zaman yanlış bir uygulamadır. Sonuçta 1000 işi aynı anda yapacak bir desktop işlemcisi henüz yok, bir çeşit map/reduce mantığı kurmak iyidir.

    www.cihanyakar.com

    13 Mayıs 2020 Çarşamba 12:17
  • Yorumunuz için teşekkürler. İstediğim yüzlerce işlemin birbirini etkilemeden işini yapması. Tek process üzerinde 10 larca thread açınca bir kaç thread diğer threadları bekletiyor. Bunun önüne geçmek istiyorum.
    13 Mayıs 2020 Çarşamba 12:35
  • Aynı CPU çekirdeğine denk gelmişlerdir bir birilerini bekliyorlardır. Bize işin doğası hakkında bilgi verseniz daha güzel cevaplar verebiliriz. Ama genellikle 3-4 thread e bölersin işleri. 

    www.cihanyakar.com

    13 Mayıs 2020 Çarşamba 12:55
  • Yorumunuz için teşekkürler. İstediğim yüzlerce işlemin birbirini etkilemeden işini yapması. Tek process üzerinde 10 larca thread açınca bir kaç thread diğer threadları bekletiyor. Bunun önüne geçmek istiyorum.
    Cekirdek sayısı 1000+ olmadıkça tarif ettiginiz Task degil mi?


    Blog
    How to create a Minimal, Reproducible Example
    The way to Go.
    World's most advanced open source (object-) relational Database.
    Flutter (for mobile, for web & desktop.


    Not: Temelin geri zekali arkadasi Idris bu mesaja da atlayip ne kadar aptal oldugunu bir kez daha belgeleyebilir. Kendisinin tek marifeti beni takip edip, neden her soruya cevap verdigimi, yardim etmeye calistigimi sorgulamaktir. Bu beyinsiz zavalliya, aptal oldugunu hatirlatmayi unutmayiniz.

    13 Mayıs 2020 Çarşamba 12:56
    Yanıtlayıcı
  • Aynı CPU çekirdeğine denk gelmişlerdir bir birilerini bekliyorlardır. Bize işin doğası hakkında bilgi verseniz daha güzel cevaplar verebiliriz. Ama genellikle 3-4 thread e bölersin işleri. 

    www.cihanyakar.com

    Sistemde müşteriler var. Her müşterinin ürünlerini başka platforma aktarmam gerekiyor. Fakat her müşteri için ayrı bir iş gerekiyor. 3-4 Thread ile sıra sıra yaparsam bu işlem aylar alır. Her müşterinin kendine ait işlemi olmalı.
    13 Mayıs 2020 Çarşamba 13:43
  • Aylarca sürecek şekilde tasarlayın, ama birden çok makinede çalıştırın.

    e-mail: onay[nokta]yalciner[at]hotmail[nokta]com

    • Yanıt Olarak İşaretleyen cblc_52 13 Mayıs 2020 Çarşamba 13:49
    • Yanıt İşaretini Geri Alan cblc_52 13 Mayıs 2020 Çarşamba 13:49
    13 Mayıs 2020 Çarşamba 13:45
    Moderatör
  • Aylarca sürecek şekilde tasarlayın, ama birden çok makinede çalıştırın.

    e-mail: onay[nokta]yalciner[at]hotmail[nokta]com

    Şuan ayrı process(exe) olarak yapıyorum ve şuan tatmin ediyor. Fakat bu işlemin çok uzun sürmemesi gerekiyor. Sanırım yine böyle devam edecem gibi duruyor ayrı process(exe) formatında birden fazla makine kullanacağız sanırım.
    13 Mayıs 2020 Çarşamba 13:50
  • Musteri ürünlerinin aktarımı neden o kadar vakit alsın anlamadım. Sanki asil yapılacak is çok çok fazla optimizasyona açık gibi. Her neyse, belki de ben yanlış anliyorumdur:

    async Task Main()
    {
    	Stopwatch sw = new Stopwatch();
    	sw.Start();
    	var tasks = new List<Task<int>>(10000);
    	for (int i = 0; i < 100; i++)
    	{
    		tasks.Add(MyTask(2000));	
    	}
    	int[] results = await Task.WhenAll(tasks);
    	sw.Stop();
    	Console.WriteLine(sw.Elapsed);
    	Console.WriteLine($"{results.Min()} - {results.Max()}");
    }
    
    Task<int> MyTask(int milliseconds) // non blocking
    {
    	Stopwatch sw = new Stopwatch();
    	sw.Start();
    	var tcs = new TaskCompletionSource<int>();
    	new Timer(_ => tcs.SetResult((int)sw.ElapsedMilliseconds)).Change(milliseconds, -1);
    	return tcs.Task;
    }


    Blog
    How to create a Minimal, Reproducible Example
    The way to Go.
    World's most advanced open source (object-) relational Database.
    Flutter (for mobile, for web & desktop.


    Not: Temelin geri zekali arkadasi Idris bu mesaja da atlayip ne kadar aptal oldugunu bir kez daha belgeleyebilir. Kendisinin tek marifeti beni takip edip, neden her soruya cevap verdigimi, yardim etmeye calistigimi sorgulamaktir. Bu beyinsiz zavalliya, aptal oldugunu hatirlatmayi unutmayiniz.

    • Yanıt Olarak İşaretleyen cblc_52 13 Mayıs 2020 Çarşamba 14:34
    13 Mayıs 2020 Çarşamba 14:23
    Yanıtlayıcı
  • Musteri ürünlerinin aktarımı neden o kadar vakit alsın anlamadım. Sanki asil yapılacak is çok çok fazla optimizasyona açık gibi. Her neyse, belki de ben yanlış anliyorumdur:

    async Task Main()
    {
    	Stopwatch sw = new Stopwatch();
    	sw.Start();
    	var tasks = new List<Task<int>>(10000);
    	for (int i = 0; i < 100; i++)
    	{
    		tasks.Add(MyTask(2000));	
    	}
    	int[] results = await Task.WhenAll(tasks);
    	sw.Stop();
    	Console.WriteLine(sw.Elapsed);
    	Console.WriteLine($"{results.Min()} - {results.Max()}");
    }
    
    Task<int> MyTask(int milliseconds) // non blocking
    {
    	Stopwatch sw = new Stopwatch();
    	sw.Start();
    	var tcs = new TaskCompletionSource<int>();
    	new Timer(_ => tcs.SetResult((int)sw.ElapsedMilliseconds)).Change(milliseconds, -1);
    	return tcs.Task;
    }


    Blog
    How to create a Minimal, Reproducible Example
    The way to Go.
    World's most advanced open source (object-) relational Database.
    Flutter (for mobile, for web & desktop.


    Not: Temelin geri zekali arkadasi Idris bu mesaja da atlayip ne kadar aptal oldugunu bir kez daha belgeleyebilir. Kendisinin tek marifeti beni takip edip, neden her soruya cevap verdigimi, yardim etmeye calistigimi sorgulamaktir. Bu beyinsiz zavalliya, aptal oldugunu hatirlatmayi unutmayiniz.

    Teşekkür ederim emek vermişsiniz. Bu yöntemle sanırım bölerek yapmak daha mantıklı olacaktır.
    13 Mayıs 2020 Çarşamba 14:35
  • Aynı CPU çekirdeğine denk gelmişlerdir bir birilerini bekliyorlardır. Bize işin doğası hakkında bilgi verseniz daha güzel cevaplar verebiliriz. Ama genellikle 3-4 thread e bölersin işleri. 


    www.cihanyakar.com

    Sistemde müşteriler var. Her müşterinin ürünlerini başka platforma aktarmam gerekiyor. Fakat her müşteri için ayrı bir iş gerekiyor. 3-4 Thread ile sıra sıra yaparsam bu işlem aylar alır. Her müşterinin kendine ait işlemi olmalı.

    Kendi bilginizi üste tutacaksanız neden soruyorsunuz?

    Forumlarda en sık yapılan hata, kişilerin sorularını değil de çözümlerini sorması oluyor. Ve asıl soruyu ancak bu cevapta alabilmeye başladık. 

    Gerçek soru şu : "Her müşterinin ürünlerini başka platforma aktarmam gerekiyor." Soru biraz eksik, Karşı platform ne?

    Karşı taraf bir veritabanı ise 1 milyon kaydı atmanız 1 dakika sürmemeli. Sürüyorsa bir dünya Insert basıyorsunuzdur.

    Karşı taraf bir web service ise o zaman bu sizin değil onların hatası. Onlar tek tek Insert basıyordur. Karşı tarafı düzeltme şansınız yoksa işlemciye uygun sayıda thread ile bu işi halletmelisiniz. TPL/Task kullandığınızda bunu .net kendisi halledecektir. (Mesaj kuyruğu ile çözmek, en uygun çözüm olabilir)

    Thread sayısı 10'u geçiyorsa bu durumda aynı process için anda açılacak TCP bağlantı limitine ulaşırsınız. Bunu da uygulamanın açılışında ServicePointManager.DefaultConnectionLimit değerini yükselterek çözebilrsiniz.


    www.cihanyakar.com




    • Düzenleyen Cihan YakarMVP 13 Mayıs 2020 Çarşamba 14:48
    • Yanıt Olarak İşaretleyen cblc_52 13 Mayıs 2020 Çarşamba 14:51
    13 Mayıs 2020 Çarşamba 14:45
  • Aynı CPU çekirdeğine denk gelmişlerdir bir birilerini bekliyorlardır. Bize işin doğası hakkında bilgi verseniz daha güzel cevaplar verebiliriz. Ama genellikle 3-4 thread e bölersin işleri. 


    www.cihanyakar.com

    Sistemde müşteriler var. Her müşterinin ürünlerini başka platforma aktarmam gerekiyor. Fakat her müşteri için ayrı bir iş gerekiyor. 3-4 Thread ile sıra sıra yaparsam bu işlem aylar alır. Her müşterinin kendine ait işlemi olmalı.

    Kendi bilginizi üste tutacaksanız neden soruyorsunuz?

    Forumlarda en sık yapılan hata, kişilerin sorularını değil de çözümlerini sorması oluyor. Ve asıl soruyu ancak bu cevapta alabilmeye başladık. 

    Gerçek soru şu : "Her müşterinin ürünlerini başka platforma aktarmam gerekiyor." Soru biraz eksik, Karşı platform ne?

    Karşı taraf bir veritabanı ise 1 milyon kaydı atmanız 1 dakika sürmemeli. Sürüyorsa bir dünya Insert basıyorsunuzdur.

    Karşı taraf bir web service ise o zaman bu sizin değil onların hatası. Onlar tek tek Insert basıyordur. Karşı tarafı düzeltme şansınız yoksa işlemciye uygun sayıda thread ile bu işi halletmelisiniz. TPL/Task kullandığınızda bunu .net kendisi halledecektir. (Mesaj kuyruğu ile çözmek, en uygun çözüm olabilir)

    Thread sayısı 10'u geçiyorsa bu durumda aynı process için anda açılacak TCP bağlantı limitine ulaşırsınız. Bunu da uygulamanın açılışında ServicePointManager.DefaultConnectionLimit değerini yükselterek çözebilrsiniz.


    www.cihanyakar.com




    Cevabınız için teşekkür ederim. Dediklerinizi deneyeceğim.
    13 Mayıs 2020 Çarşamba 14:54