elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Como proteger una cartera - billetera de Bitcoin


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  ¿Que tipo de VPS seleccionar para ejecutar 100 hilos?
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: ¿Que tipo de VPS seleccionar para ejecutar 100 hilos?  (Leído 8,362 veces)
Andres128

Desconectado Desconectado

Mensajes: 4


Ver Perfil
¿Que tipo de VPS seleccionar para ejecutar 100 hilos?
« en: 29 Julio 2017, 05:27 am »

Hola amigos del foro elhacker

Resulta que necesito comprar un VPS para ejecutar una aplicación (hecha en visual basic) que tiene una lista de cuentas de usuario un total de 100 o más, ahora necesito que se ejecuten simultáneamente las 100 y realice sus peticiones y tareas necesarias, esto es 24/7 días a la semana. (use esta librería para ejecutarlas https://github.com/amibar/SmartThreadPool

Tengo dudas:

1. Los hilos o thread que consumen RAM o procesador o las dos ???

2. Que debo tener en cuenta para seleccionar el VPS que tenga más RAM o un mejor procesador.

3. Cuanto creen que necesite de RAM o de procesador para que funcione bien.

4. Se puede dañar un PC si se ejecutar muchísimos hilos unos 500 al tiempo?? que podría pasar???

Gracias amigos por la ayuda.  
 


« Última modificación: 29 Julio 2017, 05:30 am por Andres128 » En línea

engel lex
Moderador Global
***
Desconectado Desconectado

Mensajes: 15.514



Ver Perfil
Re: ¿Que tipo de VPS seleccionar para ejecutar 100 hilos?
« Respuesta #1 en: 29 Julio 2017, 05:47 am »

sin saber que hace tu programa y como es basicamente imposible saber que recomendar, pueden ser 100 operaciones simultaneas que consuman unos pocos ciclos del procesador y 1kb de ram cada uno... o pueden ser unas bestias que requieran  30% de 1 nucleo i3 de 5ta y que consuman 100mb  de ram...

tu como encargado del proceso deberías hacer todas las respectivas pruebas para saber como funciona el programa y saber que exige...

así que simplemente respondo las preguntas

1- consumen ambos, los recursos son exigidos para cada hilo individualmente

2- depende del programa, puede consumir más ram o procesador según el caso

3- depende del programa, nadie sabe cuanto consume ni en que sistema corre... de entrada te digo que minimo 1gb de ram para levantar el sistema operativo apropiadamente

4- no, no se daña... es como afirmar que una pc se daña al abrir muchos programas al mismo tiempo... si son muchos hilos el sistema operativo los organizará en la tabla de prioridades y se procesarán poco a poco... eso si, poco a poco puede ser 0.01 segundo por proceso por nucleo, así que siendo por ejemplo 8 nucleos, serían unos 0.6 segudos para procesar y cerrar todas las peticiones... si no tienes suficiente potencia el sistema operativo se puedes quedar pegado... en ese caso el vps lo detectará y reiniciará

por ejemplo, en mi oficina hice en python un servidor dns que lee una tabla postgres, siendo cada petición 1 hilo, eso lo puede llevar una pc doble nucleo vieja en linux con 2gb de ram sin problema, sin pasar de 50% de procesamiento ni de 50% de ram, sabiendo que son unas 100 peticiones por segundo... así mismo hay otro servidor (php mal diseñado hace muchos años) que al ser apache abre cada vez un hilo... con 8 peticiones por segundo en una maquina más moderna con 4 nucleos y 4 gb de ram... en tope de uso consume mas del 80% de ram y procesador a 100%

eso como aclaratoria que depende mucho del sistema


« Última modificación: 29 Julio 2017, 05:52 am por engel lex » En línea

El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.
Andres128

Desconectado Desconectado

Mensajes: 4


Ver Perfil
Re: ¿Que tipo de VPS seleccionar para ejecutar 100 hilos?
« Respuesta #2 en: 29 Julio 2017, 06:05 am »

@engel lex muchas gracias bro una respuesta muy directa y precisa, me ha servido bastante. Por cierto que herramienta o programa me recomiendas para revisar cuanto consume de RAM la aplicación y cuando procesador esta consumiendo. jeje interesante puedo usar linux para dicha labor, ya veremos. Gracias y saludos brother.
En línea

engel lex
Moderador Global
***
Desconectado Desconectado

Mensajes: 15.514



Ver Perfil
Re: ¿Que tipo de VPS seleccionar para ejecutar 100 hilos?
« Respuesta #3 en: 29 Julio 2017, 06:16 am »

no vas a poder user linux XD es visual basic, necesitas windows...

no estoy seguro si el mismo ide de .net trae las herramientas de analisis y realmente de herramientas en windows poco se XD

sin embargo aquí un articulo, pero no veo nada para VB
https://en.wikipedia.org/wiki/List_of_performance_analysis_tools

En línea

El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.
Andres128

Desconectado Desconectado

Mensajes: 4


Ver Perfil
Re: ¿Que tipo de VPS seleccionar para ejecutar 100 hilos?
« Respuesta #4 en: 29 Julio 2017, 07:01 am »

interesante...Estaba pensando en usar Wine para que me salga barato el VPS, realizare varias pruebas para ver como se comporta :D gracias amigo por la ayuda.

PD: Soy nuevo en esto de los Hilos pero me parece tan interesante.
En línea

engel lex
Moderador Global
***
Desconectado Desconectado

Mensajes: 15.514



Ver Perfil
Re: ¿Que tipo de VPS seleccionar para ejecutar 100 hilos?
« Respuesta #5 en: 29 Julio 2017, 07:07 am »

cuidado al usar wine... no es un emulador total que digamos, no emula todo... aunque si puede simular mucho sin problema ni demasiada sobre carga

especialmente para aplicaciones de alta disponibilidad, no juegas con la base D: prueba muy bien wine si lo vas a usar hasta sus limites, porque tiende a dar errores puntuales raros en casos especificos XD

y no olvides si realmente necesitas alta disponibilidad hacer redundancia... 2 servidores identicos en caso que 1 falle

toma en cuenta que los hilos no siempre son la mejor solución... pero es cosa que busques algún libro sobre el mutithreading a profundidad
« Última modificación: 29 Julio 2017, 07:09 am por engel lex » En línea

El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.
Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.788



Ver Perfil
Re: ¿Que tipo de VPS seleccionar para ejecutar 100 hilos?
« Respuesta #6 en: 29 Julio 2017, 11:57 am »

ejecutar una aplicación que tiene una lista de cuentas de usuario un total de 100 o más, ahora necesito que se ejecuten simultáneamente las 100 y realice sus peticiones y tareas necesarias

Eso no es una buena idea.

Crear tal cantidad como 100 threads provocará una gran demanda de interrupción en la ejecución de cada thread activo por core en la CPU (thread swaping) en el programador de threads del sistema operativo. Dependiendo de lo intensivas que sean esas "peticiones y tareas necesarias" que has mencionado, esto que acabo de mencionar puede ser algo insignificante, o por lo contrario un problema de gravedad a tomarse en cuenta con su debida seriedad.

Por lo general no te conviene en absoluto crear 100 threads, sino más bien crear unos pocos threads (4, 8, 16) y dividir el trabajo entre ellos. De esta manera, 1 thread trabajará sobre más de un elemento distinto (lista de cuenta de usuario), optimizando el trabajo y realizando un uso más eficiente y escalable de los recursos del sistema.



1. Los hilos o thread que consumen RAM o procesador o las dos ???
1- consumen ambos, los recursos son exigidos para cada hilo individualmente

Hay que tener en cuenta que en los lenguajes de alto nivel (abstractos) como VB.NET y C# ( o más bien dicho .NET Framework ) se optimiza el uso de los threads, pues lo que un programador suele llamar thread o hilo, es en realidad un wrapper de alto nivel que abstrae cierta funcionalidad de un thread del sistema. A raíz de esto hay toda una extensa serie de implementaciones abstractas en la librería de clases de .NET Framework para cubrir, administrar y perfeccionar muchos aspectos relacionados con el uso/rendimiento de los threads, empezando por la implementación de un gestionador de threads (un Thread Pool y un Task Scheduler). El compilador de .NET genera ciertas optimizaciones automáticas en las instrucciones designadas al uso de threads, y los runtimes junto al programador de threads del S.O. se encargan de procesarlas y hacer el resto.

Respecto al consumo, los threads de una aplicación .NET comparten el mismo espacio de memoria de la aplicación (como es evidente, pues un thread no es un proceso independiente de la aplicación, sino un subset del proceso padre, como un subset de subprocesos), y siempre que puedan éstos compartirán y consumirán los recursos de otros threads del proceso por así decirlo de forma comprensible. Es decir, que no estrictamente siempre se deberá asignar un espacio extra/adicional para administrar los recursos de un nuevo thread (aparte del tamaño de la pila o call stack que eso sí siempre es independiente en cada thread), el GarbageCollector de .NET determinará lo que se puede aprovechar/compartir/reciclar con otro thread, y lo que se debe destruir pro completo. En general, llegar a comprender de forma fidedigna como .NET administra los recursos de memoria asignados en una aplicación es bastante (muy) complejo y confuso, o al menos a mi me resulta así ...en comparación con otros.



2. Que debo tener en cuenta para seleccionar el VPS que tenga más RAM o un mejor procesador.
2- depende del programa, puede consumir más ram o procesador según el caso

3. Cuanto creen que necesite de RAM o de procesador para que funcione bien.
3- depende del programa, nadie sabe cuanto consume ni en que sistema corre... de entrada te digo que minimo 1gb de ram para levantar el sistema operativo apropiadamente

Equilibrio, así de simple. Ante la duda, siempre se debe buscar un sistema equilibrado para intentar minimizar las consecuencias de un posible impacto negativo en un factor (CPU) o en el otro (RAM).

Evidentemente en este tipo de escenario multihilo, cuantos más cores y núcleos por core es mejor, y a más RAM será todavía mucho mejor.

También se debe tener en cuenta que tipo de actividad realizarán tus threads y tu aplicación en general (ej. cargar montones de imagenes de alta resolución en un buffer de memoria, o realizar operaciones masivas I/O de escritura o lectura en disco con 1000 archivos de forma simultanea) y como de intensiva será dicha actividad. Eso no podemos saberlo nosotros, tú eres el desarrollador de tu código y por el momento no nos has mostrado NADA del código como para poder orientarte... aunque de todas formas y para ser sincero yo sobre servidores privados de máquinas virtuales apenas sé nada xD.



4. Se puede dañar un PC si se ejecutar muchísimos hilos unos 500 al tiempo?? que podría pasar???

4- no, no se daña... es como afirmar que una pc se daña al abrir muchos programas al mismo tiempo... si son muchos hilos el sistema operativo los organizará en la tabla de prioridades y se procesarán poco a poco... eso si, poco a poco puede ser 0.01 segundo por proceso por nucleo, así que siendo por ejemplo 8 nucleos, serían unos 0.6 segudos para procesar y cerrar todas las peticiones... si no tienes suficiente potencia el sistema operativo se puedes quedar pegado... en ese caso el vps lo detectará y reiniciará

eso como aclaratoria que depende mucho del sistema

Poco más puedo aportar a la respuesta del copañero @Engel Lex. Como ya te han dicho: no se "daña", y los efectos observables serían exactamente los mismos que si te pones a iniciar 100 procesos distintos al mismo tiempo: una sobrecarga de recursos que tendrá como consecuencia una ralentización del sistema operativo.

Pero cabría destacar que .NET Framework se encarga de buscar el equilibrio perfecto de una aplicación multihilo, determinando de forma automática la cantidad mímina y máxima de threads que pueden estar iniciados en paralelo al mismo tiempo por dicha aplicación. Esto se decide en base a muchos factores, así que un colapso de recursos en el S.O. es más bien improbable al ser teoricamente imposible de suceder por si solo (a menos que modificases de forma arbitraria los límites de threads mínimos y máximos por defecto en la aplicación).



(use esta librería para ejecutarlas https://github.com/amibar/SmartThreadPool

En mi opinión haces mal al usar una reimplementación de algo que no sea la implementación original de Microsoft, a eso se le llama REINVENTAR LA RUEDA !!. Otra cosa bien distinta sería utilizar una librería que extienda la implementación original para añadirle funcionalidades adicionales, que sinceramente no sé si será el caso, pero por lo poco que he leido en esa página de CodeProject... no parece ser el caso.

Si te fijas bien, verás que ese proyecto lleva en desarrollo desde el año 2003, esto viene a ser el mismo año en el que se utilizaba .NET Framework 1.0, es en ese año cuando nació ese proyecto de CodeProject, y puede que por aquél entonces si que valiese la pena utilizar una implementación de terceros del thread pool de .NET Framework, ya que simplemente era la versión 1.0 del producto y había muchas cosas que pulir, pero hoy en dia francamente ese tipo de librerías las veo algo de lo más innecesario y sin mucha utilidad real (pues quien la use solo la usará por simple desconocimiento de como llevar a cabo la misma tarea de forma "nativa" o guiada mediante el instrumental que provee .NET Framework ), además solo conseguirías obtener justo lo opuesto a ese rendimiento óptimo que estás buscando...

En .NET Framework, la cantidad máxima de threads administrados que puedes mantener activos (por defecto) se determina en base a muchos factores, podemos abreviar todos estos factores como un conjunto de recursos (RAM) y disponibilidad de cores en CPU. El máximo límite de threads que puedes iniciar de forma simultanea se ve incrementado en cada versión de .NET Framework. Te puedo decir que el límite es de 1023 threads administrados en .NET Framework 4.0, y 2047 en .NET Framework 4.6, ojo, eso solamente en aplicaciones de 32 Bits, ya que este número se ve multiplicado por 16 para una aplicación de 64-Bits, siendo así un límite máximo de 32.767 threads en el thread pool de .NET Framework 4.6 x64. Luego existe un límite de threads de operaciones I/O, cuyo valor no varia y siempre son 1.000 (pero también lo puedes modificar). De todas formas estamos hablando de números/límites muy altos que probablemente nunca podrán ser revasados por una aplicación "normal", y de intentarlo posría provocar un desbordmiento (overflow) de la pila o stack de la aplicación.

Otro motivo por el cual me resulta innecesaria esa reimplementación...que te la "venden" como si fuese la única posibilidad de poder asignar un límite mínimo de threads activos de forma simultanea, es que la librería de clases de .NET Framework proporciona miembros para modificar tanto el límite mínimo como el máximo de threads en tu aplicación (aunque por otro lado esto no limita la cantidad mínima ni máxima de threads dedicados en la aplicación): System.Threading.ThreadPool.SetMinThreads() y System.Threading.ThreadPool.SetMaxThreads(), y además provee varias alternativas de hacer "lo mismo", por orden de abstracción de un thread del sistema: la clase Thread, BackgroundWorker, y Task, cada una de ellas enfocada a distintos escenarios (thread dedicado, thread que necesite interactuar con los controles de la UI, thread 'fire and forget', etc).

¿Todavía sigues creyendo que necesitas recurrir a una librería de terceros para poder ejecutar 100 threads de forma simultanea en una aplicación .NET?, no, en absoluto, y como ya digo... solamente conseguirías desaprovechar los beneficios de la implementación de Microsoft, no obtendrías ese rendimiento óptimo que buscas.

En mi opinión, para lo que pretendes hacer creo que te serviría de mucho usar la clase ThreadPool de .NET. Mientras que la creación y ejecución de un thread administrado (clase: System.Threading.Thread) puede resultar una operación expensiva para el S.O., la clase ThreadPool rehusa los threads y amortigua esos costes adicionales de creación y ejecución. Además, dicha clase ayuda a simpliicar el procedimiento de creación, ejecución y detención/aborto de los threads.

Aquí te muestro un ejemplo de como utilizar el Thread Pool de .NET para mantener 100 threads activos (como mínimo) de forma simultanea:

VB.NET
Código
  1. Imports System
  2. Imports System.Diagnostics
  3. Imports System.Threading
  4.  
  5. Public Module Module1
  6.  
  7.    <MTAThread>
  8.    Public Sub Main()
  9.  
  10.        Dim minThreadCount As Integer = 100
  11.        Dim maxThreadCount As Integer
  12.        Dim minIOThreadCount As Integer
  13.        Dim maxIOThreadCount As Integer
  14.  
  15.        ThreadPool.GetMinThreads(Nothing, minIOThreadCount)
  16.        ThreadPool.GetMaxThreads(maxThreadCount, maxIOThreadCount)
  17.        If (maxThreadCount <= minThreadCount) Then
  18.            maxThreadCount = (minThreadCount + 1)
  19.        End If
  20.  
  21.        ThreadPool.SetMinThreads(minThreadCount, minIOThreadCount)
  22.        ThreadPool.SetMaxThreads(maxThreadCount, maxIOThreadCount)
  23.  
  24.        Debug.WriteLine("Minimum Thread Count: {0}", minThreadCount)
  25.        Debug.WriteLine("Maximum Thread Count: {0}", maxThreadCount)
  26.  
  27.        For i As Integer = 0 To Byte.MaxValue ' Loop trough 0 to 255
  28.            Dim wcb As New WaitCallback(AddressOf MyThreadWork)
  29.            ThreadPool.QueueUserWorkItem(wcb, Nothing)
  30.        Next i
  31.        Thread.Sleep(TimeSpan.FromSeconds(1))
  32.  
  33.        Dim activeThreadCount As Integer = Process.GetCurrentProcess().Threads.Count
  34.        Debug.WriteLine("Amount of active threads: {0}", activeThreadCount)
  35.        Console.ReadKey()
  36.        Environment.Exit(0)
  37.  
  38.    End Sub
  39.  
  40.     ' <MethodImpl(MethodImplOptions.Synchronized)>
  41.    Private Sub MyThreadWork(ByVal stateInfo As Object)
  42.        Thread.Sleep(Timeout.Infinite)
  43.    End Sub
  44.  
  45. End Module

C#
Código
  1. using System;
  2. using System.Diagnostics;
  3. using System.Threading;
  4.  
  5. namespace ConsoleApp1 {
  6.  
  7.    class Program {
  8.  
  9.        [MTAThread()]
  10.        static void Main(string[] args) {
  11.  
  12.            int minThreadCount = 100;
  13.            int maxThreadCount = 0;
  14.            int minIOThreadCount = 0;
  15.            int maxIOThreadCount = 0;
  16.  
  17.            ThreadPool.GetMinThreads(out int nul, out minIOThreadCount);
  18.            ThreadPool.GetMaxThreads(out maxThreadCount, out maxIOThreadCount);
  19.            if (maxThreadCount <= minThreadCount) {
  20.                maxThreadCount = (minThreadCount + 1);
  21.            }
  22.  
  23.            ThreadPool.SetMinThreads(minThreadCount, minIOThreadCount);
  24.            ThreadPool.SetMaxThreads(maxThreadCount, maxIOThreadCount);
  25.  
  26.            Debug.WriteLine("Minimum Thread Count: {0}", minThreadCount);
  27.            Debug.WriteLine("Maximum Thread Count: {0}", maxThreadCount);
  28.  
  29.            for (int i = 0; i <= byte.MaxValue; i++) { // Loop trough 0 to 255
  30.                WaitCallback wcb = new WaitCallback(MyThreadWork);
  31.                ThreadPool.QueueUserWorkItem(wcb, null);
  32.            }
  33.            Thread.Sleep(TimeSpan.FromSeconds(1));
  34.  
  35.            int activeThreadCount = Process.GetCurrentProcess().Threads.Count;
  36.            Debug.WriteLine("Amount of active threads: {0}", activeThreadCount);
  37.            Console.ReadKey();
  38.            Environment.Exit(0);
  39.  
  40.        }
  41.  
  42.        // [MethodImpl(MethodImplOptions.Synchronized)]
  43.        static void MyThreadWork(object stateInfo) {
  44.            Thread.Sleep(Timeout.Infinite);
  45.        }
  46.    }
  47. }

También puedes hacer uso del paralelismo para iniciar una determinada cantidad de tareas en paralelo (léase: threads) de forma simultanea (en base a los límites actuales establecidos en el thread pool de .NET):

VB.NET:
Código
  1. Imports System
  2. Imports System.Diagnostics
  3. Imports System.Threading
  4. Imports System.Threading.Tasks
  5.  
  6. Public Module Module1
  7.  
  8.    <MTAThread>
  9.    Public Sub Main()
  10.  
  11.        Dim minThreadCount As Integer = 100
  12.        Dim maxThreadCount As Integer
  13.        Dim minIOThreadCount As Integer
  14.        Dim maxIOThreadCount As Integer
  15.  
  16.        ThreadPool.GetMinThreads(Nothing, minIOThreadCount)
  17.        ThreadPool.GetMaxThreads(maxThreadCount, maxIOThreadCount)
  18.        If (maxThreadCount <= minThreadCount) Then
  19.            maxThreadCount = (minThreadCount + 1)
  20.        End If
  21.  
  22.        ThreadPool.SetMinThreads(minThreadCount, minIOThreadCount)
  23.        ThreadPool.SetMaxThreads(maxThreadCount, maxIOThreadCount)
  24.  
  25.        Dim options As New ParallelOptions() With {
  26.            .CancellationToken = CancellationToken.None,
  27.            .TaskScheduler = TaskScheduler.Current,
  28.            .MaxDegreeOfParallelism = minThreadCount
  29.        }
  30.  
  31.        Dim action As New Action(Of Integer, ParallelLoopState)(AddressOf MyThreadWork)
  32.  
  33.        Parallel.For(0, Byte.MaxValue, options, action) ' Loop trough 0 to 255
  34.  
  35.        Console.ReadKey()
  36.        Environment.Exit(0)
  37.  
  38.    End Sub
  39.  
  40.    ' <MethodImpl(MethodImplOptions.Synchronized)>
  41.    Private Sub MyThreadWork(ByVal i As Integer, state As ParallelLoopState)
  42.        Static flag As Boolean = False
  43.        Dim activeThreadCount As Integer = Process.GetCurrentProcess().Threads.Count
  44.        If (activeThreadCount >= 100) AndAlso Not (flag) Then
  45.            flag = Not flag
  46.            Debug.WriteLine("Amount of active threads: {0}", activeThreadCount)
  47.        End If
  48.        Thread.Sleep(Timeout.Infinite)
  49.    End Sub
  50.  
  51. End Module

C#
Código
  1. using System;
  2. using System.Diagnostics;
  3. using System.Threading;
  4. using System.Threading.Tasks;
  5.  
  6. namespace ConsoleApp1 {
  7.  
  8.    class Program {
  9.  
  10.        [MTAThread()]
  11.        static void Main(string[] args) {
  12.  
  13.            int minThreadCount = 100;
  14.            int maxThreadCount = 0;
  15.            int minIOThreadCount = 0;
  16.            int maxIOThreadCount = 0;
  17.  
  18.            ThreadPool.GetMinThreads(out int nul, out minIOThreadCount);
  19.            ThreadPool.GetMaxThreads(out maxThreadCount, out maxIOThreadCount);
  20.            if (maxThreadCount <= minThreadCount) {
  21.                maxThreadCount = (minThreadCount + 1);
  22.            }
  23.  
  24.            ThreadPool.SetMinThreads(minThreadCount, minIOThreadCount);
  25.            ThreadPool.SetMaxThreads(maxThreadCount, maxIOThreadCount);
  26.  
  27.            Debug.WriteLine("Minimum Thread Count: {0}", minThreadCount);
  28.            Debug.WriteLine("Maximum Thread Count: {0}", maxThreadCount);
  29.  
  30.            ParallelOptions options = new ParallelOptions {
  31.                CancellationToken = CancellationToken.None,
  32.                TaskScheduler = TaskScheduler.Current,
  33.                MaxDegreeOfParallelism = minThreadCount
  34.            };
  35.  
  36.            Action<int, ParallelLoopState> action = new Action<int, ParallelLoopState>(MyThreadWork);
  37.  
  38.            Parallel.For(0, byte.MaxValue, options, action); // Loop trough 0 to 255
  39.  
  40.            Console.ReadKey();
  41.            Environment.Exit(0);
  42.  
  43.        }
  44.  
  45.        static bool flag = false;
  46.        // [MethodImpl(MethodImplOptions.Synchronized)]
  47.        static void MyThreadWork(int i, ParallelLoopState state) {
  48.            int activeThreadCount = Process.GetCurrentProcess().Threads.Count;
  49.            if ((activeThreadCount >= 100) && !(flag)) {
  50.                flag = !flag;
  51.                Debug.WriteLine("Amount of active threads: {0}", activeThreadCount);
  52.            }
  53.            Thread.Sleep(Timeout.Infinite);
  54.        }
  55.    }
  56. }



Estaba pensando en usar Wine para que me salga barato el VPS, realizare varias pruebas para ver como se comporta :D

Hace muuuchos años que no manejo de forma seria Linux ni Wine; las cosas habrán cambiado mucho desde aquél entonces, se supone que ahora Wine permite instalar .NET Framework y hasta la versión 4.6 nada menos, pero lo cierto es que si tu intención es instalar Wine para poder ejecutar esa aplicación desarrollada en VB.NET... entonces NO NECESITAS USAR WINE. Además de por si la idea de usar un pseudo-emulador para solucionar el problema no debería ser tu primera opción.

...¿Y entonces cómo hacerlo?, pues bien, para empezar te hago saber que tienes a tu disposición una implementación de terceros de .NET Framework multiplataforma llamada Mono, que es capaz de correr aplicaciones desarrolladas para la plataforma .NET Framework en Linux. No es estrictamente necesario desarrollar la aplicación con la IDE Mono Develop (pero si recomendable para no cometer errores de compatibilidad), puedes desarrollar la aplicación de forma normal con Visual Studio, ya que las librerías de los runtimes de Mono solo se necesitan para iniciar la aplicación.

Y mucho mejor que Mono tienes una opción más óptima a tu disposición: desde hace unos pocos años Microsoft provee una implementación reducida y multiplataforma de .NET Framework llamada .NET Core, que al igual que Mono nos permite crear aplicaciones para Linux, con todos los beneficios y optimizaciones que ello implica por la garantia Made In Microsoft .

En fin, espero que algo de todo lo que expliqué te haya podido servir de ayuda.

Saludos!
« Última modificación: 29 Julio 2017, 12:43 pm por Eleкtro » En línea

engel lex
Moderador Global
***
Desconectado Desconectado

Mensajes: 15.514



Ver Perfil
Re: ¿Que tipo de VPS seleccionar para ejecutar 100 hilos?
« Respuesta #7 en: 29 Julio 2017, 19:36 pm »

disculpa, nunca me metí en el lio de mono... pero no era super limitaday era una vago intento de netframework incompleto?... eso recuerdo hasta la ultima vez que vi el proyecto :s
En línea

El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.
Serapis
Colaborador
***
Desconectado Desconectado

Mensajes: 3.348


Ver Perfil
Re: ¿Que tipo de VPS seleccionar para ejecutar 100 hilos?
« Respuesta #8 en: 29 Julio 2017, 23:34 pm »

En un procesador de sobremesa, es un error pretender arrancar 100 hilos simultáneos.

Dado la cantidad de cores del procesador, el resto será procesado paralelo simulado, es decir cesión de tiempos y recursos compartidos. Luego si no va a ser paralelo real, tampoco hay necesaidad de crear 100 hilos con sus respectivo consumo. es preferible que crees solo 2,4,6 y que internamente seas tú quien vaya rotando entre procesos. El resultado final será más óptimo de esta manera (salvo que lo programes muy mal), ya que en un momento dado, cada proceso en marcha tendrá a su disposición la casi totalidad de recursos (la memoria reservada por los procesos comenzados ya está ocupada). Incluso sería más óptimo realizarlos en serie, cuando uno acabe que inice otro, así si solo hay 4 hilos, la memoria está disponible para 'repartir' entre 4 procesos, no para 'repartir' entre 100...

Si existe la necesaidad real de que deban ser paralelos porque realizan tareas en tiempo real, entonces lo razonable es disponer de una red de ordenadores y que uno actúe de servidor repartiendo las tareas entre el resto....
En línea

Andres128

Desconectado Desconectado

Mensajes: 4


Ver Perfil
Re: ¿Que tipo de VPS seleccionar para ejecutar 100 hilos?
« Respuesta #9 en: 30 Julio 2017, 01:59 am »

@engel lex Gracias amigo por interesarles el tema de los hilos es tan fascinante.

@Eleкtro :O impresionante, me quito el sombrero, tanto conocimiento que tienes no logro entender como le hacen para saber tanto, te pareces al .paul y a jmcilhinney de vbforums, conocen estos lenguajes profundamente.

Gracias por compartir el conocimiento conmigo me ha servido muchísimo  ;-)  , pasando a al tema de la aplicación les cuento un poco lo que hace, se basa en hacer follow y unfollow en una red social famosa, sin embargo constantemente utiliza archivos de texto para almacenar datos de los usuarios (SI yo se que debí usar bases de datos (era novato cuando lo inicie), pero bueno ahorita no puedo cambiar por que seria empezar desde 0 y no tengo tiempo), simplemente hace eso, claro esta que son varias peticiones, como logueo, follow, unfollow, revisar el usuario obtener su nombre, escribir archivo de texto, leerlos, etc.

Si yo ya había probado ThreadPool.QueueUserWorkItem y el Parallel pero no me habían dado el resultado esperado (me había saltado el WaitCallback de pronto por eso fue), voy a probar ya mismo tus ejemplos están muy interesante ;)  bueno y como no me daban el resultado encontré esa librería de terceros SmartThreadPool su ultima versión fue el 2016 https://www.nuget.org/packages/SmartThreadPool.dll/ , seguiré probando y aprendiendo.

No tenia ni idea de que era IDE Mono Develop excelente dato.

@Eleкtro ultima duda en el caso ThreadPool.QueueUserWorkItem como hago para esperar a que terminen de trabajar, es decir un waitall para que se espere hasta que terminen de trabajar los hilos???

@engel lex buen dato bro, saludos. Pero como hago eso, es que necesito que se ejecuten simultáneamente por que las acciones y tareas por cuenta se demora como 3 o 4 horas, no se como dividir tareas en un hilo  :-[

Se podría con pipe https://www.codeproject.com/Articles/7933/Smart-Thread-Pool#PipeExample
« Última modificación: 30 Julio 2017, 02:14 am por Andres128 » En línea

Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Metodo para listar y seleccionar..
Programación Visual Basic
Wolverine 3 2,937 Último mensaje 20 Julio 2005, 21:42 pm
por soplo
Seleccionar unidad y ejecutar comando « 1 2 3 4 »
Scripting
Dany3j 32 20,688 Último mensaje 17 Agosto 2011, 16:04 pm
por erickvcr
Opción para seleccionar posts
Sugerencias y dudas sobre el Foro
Caster 2 2,959 Último mensaje 3 Febrero 2012, 23:47 pm
por Mr. X
Como seleccionar tipo de copia de seguridad en Windows 7
Windows
d3xf4ult 1 2,334 Último mensaje 19 Abril 2012, 00:22 am
por d3xf4ult
Un exploit zero-day permite ejecutar cualquier tipo de código en Ubuntu y Fedora
Noticias
wolfbcn 2 2,079 Último mensaje 16 Diciembre 2016, 15:07 pm
por MCKSys Argentina
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines