{"id":4133,"date":"2019-12-05T13:13:02","date_gmt":"2019-12-05T13:13:02","guid":{"rendered":"https:\/\/www.tcit.cl\/2019\/12\/05\/perfile-aplicacion-react-rendimiento-copy\/"},"modified":"2023-04-26T15:29:32","modified_gmt":"2023-04-26T19:29:32","slug":"benchmarking-de-fibras-hilos-y-procesos","status":"publish","type":"post","link":"https:\/\/www.tcit.cl\/ingles\/benchmarking-de-fibras-hilos-y-procesos\/","title":{"rendered":"Benchmarking de fibras, hilos y procesos"},"content":{"rendered":"<div class=\"fusion-fullwidth fullwidth-box fusion-builder-row-1 fusion-flex-container nonhundred-percent-fullwidth non-hundred-percent-height-scrolling\" style=\"--awb-border-radius-top-left:0px;--awb-border-radius-top-right:0px;--awb-border-radius-bottom-right:0px;--awb-border-radius-bottom-left:0px;--awb-padding-top:4%;--awb-padding-bottom:4%;--awb-flex-wrap:wrap;\" ><div class=\"fusion-builder-row fusion-row fusion-flex-align-items-flex-start fusion-flex-content-wrap\" style=\"max-width:1341.6px;margin-left: calc(-4% \/ 2 );margin-right: calc(-4% \/ 2 );\"><div class=\"fusion-layout-column fusion_builder_column fusion-builder-column-0 fusion_builder_column_1_1 1_1 fusion-flex-column\" style=\"--awb-padding-top:3%;--awb-padding-right:5%;--awb-padding-bottom:3%;--awb-padding-left:5%;--awb-overflow:hidden;--awb-bg-size:cover;--awb-border-color:#4db6ac;--awb-border-top:1px;--awb-border-right:1px;--awb-border-bottom:1px;--awb-border-left:1px;--awb-border-style:solid;--awb-border-radius:5px 5px 5px 5px;--awb-width-large:100%;--awb-margin-top-large:0px;--awb-spacing-right-large:1.92%;--awb-margin-bottom-large:0px;--awb-spacing-left-large:1.92%;--awb-width-medium:100%;--awb-spacing-right-medium:1.92%;--awb-spacing-left-medium:1.92%;--awb-width-small:100%;--awb-spacing-right-small:1.92%;--awb-spacing-left-small:1.92%;\"><div class=\"fusion-column-wrapper fusion-column-has-shadow fusion-flex-justify-content-flex-start fusion-content-layout-column\"><div class=\"fusion-text fusion-text-1 text-blog\"><h1 class=\"css-smbne5\">Benchmarking de fibras, hilos y procesos<\/h1>\n<p class=\"\">Hace un tiempo, me propuse analizar el rendimiento de Fiber y c\u00f3mo ha mejorado en las \u00faltimas versiones de Ruby. \u00a1Despu\u00e9s de todo, la concurrencia es uno de los tres pilares de Ruby 3&#215;3 ! Adem\u00e1s, ha habido algunas aceleraciones importantes en la clase Ruby&#8217;s Fiber de Samuel Williams .<\/p>\n<p class=\"\">No es dif\u00edcil escribir un microbenchmark para algo como Fiber.yield . Pero es m\u00e1s dif\u00edcil y m\u00e1s interesante escribir un punto de referencia que sea \u00fatil y representativo.<\/p>\n<div id=\"block-0ce40a5a0543fac0361a\" class=\"sqs-block html-block sqs-block-html\" data-block-type=\"2\">\n<div id=\"yui_3_17_2_1_1575551499834_517\" class=\"sqs-block-content\">\n<h2>Espera, espera, espera&#8230;<\/h2>\n<\/div>\n<\/div>\n<div id=\"block-yui_3_17_2_1_1567226523116_27781\" class=\"sqs-block html-block sqs-block-html\" data-block-type=\"2\">\n<div class=\"sqs-block-content\">\n<p class=\"\">Bien, primero un resumen r\u00e1pido: \u00bfqu\u00e9 son las fibras?\u00a0 <img decoding=\"async\" class=\"lazyload alignright\" src=\"data:image\/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\" data-orig-src=\"https:\/\/images.squarespace-cdn.com\/content\/v1\/562ea223e4b0e0b9dab0b930\/1567230852223-R1D5NTFFUWKX98UNW479\/ke17ZwdGBToddI8pDm48kEBP2J4qC6JzpPJ1TfhRUE1Zw-zPPgdn4jUwVcJE1ZvWQUxwkmyExglNqGp0IvTJZamWLI2zvYWH8K3-s_4yszcp2ryTI0HqTOaaUohrI8PIpAcrfHy5pvMwnm_saE6HkRfpElANzITP95e7x2FOGm0\/concurrency_vs_parallelism.png?format=500w\" alt=\"Y no me hagas empezar con el paralelismo ...\" \/><\/p>\n<p class=\"\">\u00bfSabes c\u00f3mo puedes bifurcar un proceso o crear un hilo y de repente hay este c\u00f3digo que tambi\u00e9n se est\u00e1 ejecutando, junto con tu c\u00f3digo? Quiero decir, claro, no necesariamente se ejecuta literalmente al mismo tiempo. Pero hay otro flujo de control y, a veces, se est\u00e1 ejecutando. Todo esto se llama concurrencia por parte de los desarrolladores que son exigentes con el vocabulario.<\/p>\n<p class=\"\">Una fibra es as\u00ed. Sin embargo, cuando tiene varias fibras en ejecuci\u00f3n, no cambian autom\u00e1ticamente de una a otra. En cambio, cuando una fibra llama a Fiber.yield , Ruby cambiar\u00e1 a otra fibra. Siempre y cuando todas las fibras obtengan rendimiento regularmente, todas tienen la oportunidad de funcionar y el resultado es muy eficiente.<\/p>\n<p class=\"\">Las fibras, como los hilos, se ejecutan dentro de su proceso. En comparaci\u00f3n, si llama \u00abfork\u00bb para un nuevo proceso, entonces, por supuesto, no est\u00e1 en el mismo proceso. As\u00ed como un proceso puede contener m\u00faltiples hilos, un hilo puede contener m\u00faltiples fibras. Por ejemplo, podr\u00eda escribir una aplicaci\u00f3n con diez procesos, cada uno con ocho hilos, y cada uno de esos hilos podr\u00eda tener seis fibras.<\/p>\n<p class=\"\">Un hilo es m\u00e1s liviano que un proceso, y m\u00faltiples pueden ejecutarse dentro de un proceso. Una fibra es m\u00e1s liviana que un hilo, y pueden ejecutarse m\u00faltiples dentro de un hilo. Y a diferencia de los subprocesos o procesos, las fibras tienen que alternar manualmente de un lado a otro llamando a \u00abrendimiento\u00bb. Pero a cambio, en muchos casos obtienen menos uso de memoria y menos sobrecarga del procesador que los subprocesos.<\/p>\n<p class=\"\">\u00bfTener sentido?<\/p>\n<p class=\"\">Tambi\u00e9n hablaremos sobre el <strong>Global Interpreter Lock<\/strong> , o <strong>GIL<\/strong> , que en estos d\u00edas se llama m\u00e1s correctamente Global VM Lock o GVL, pero nadie lo hace, as\u00ed que lo llamo el GIL aqu\u00ed. B\u00e1sicamente, m\u00faltiples hilos o fibras de Ruby dentro de un solo proceso <strong>solo<\/strong> pueden <strong>tener uno de ellos ejecutando Ruby a la vez<\/strong> . Eso puede hacer una gran diferencia en el rendimiento . No vamos a profundizar en el GIL aqu\u00ed, pero es posible que desee investigar m\u00e1s a fondo si este tema le interesa.<\/p>\n<\/div>\n<div id=\"block-yui_3_17_2_1_1567226523116_27781\" class=\"sqs-block html-block sqs-block-html\" data-block-type=\"2\">\n<div class=\"sqs-block-content\">\n<h2>\u00bfPor qu\u00e9 no los servidores de aplicaciones?<\/h2>\n<\/div>\n<\/div>\n<div id=\"block-yui_3_17_2_1_1567226523116_34965\" class=\"sqs-block html-block sqs-block-html\" data-block-type=\"2\">\n<div class=\"sqs-block-content\">\n<p class=\"\">Algunos de ustedes piensan, \u00abpero comparar hilos y fibras no es nada dif\u00edcil\u00bb. Despu\u00e9s de todo, hago muchos puntos de referencia HTTP aqu\u00ed. \u00bfPor qu\u00e9 no simplemente comparar Puma , que usa hilos, contra Falcon , que usa fibras, y llamarlo un d\u00eda?<\/p>\n<p class=\"\">Muchas razones. <img decoding=\"async\" class=\"lazyload alignright\" src=\"data:image\/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\" data-orig-src=\"https:\/\/images.squarespace-cdn.com\/content\/v1\/562ea223e4b0e0b9dab0b930\/1567231027728-M1OOX1LBCZ2INCZ0V005\/ke17ZwdGBToddI8pDm48kMFnwbODhn1AIfc9g4c4WxEUqsxRUqqbr1mOJYKfIPR7LoDQ9mXPOjoJoqy81S2I8N_N4V1vUb5AoIIIbLZhVYxCRW4BPu10St3TBAUQYVKch51kvNRCiDBiE3XIFbba_NeRKo2t4nRsDiqR_Lk-QwdXzV67Un09lEw0Vwgcqlag\/image-asset.png?format=500w\" alt=\"Es un buen logo, \u00bfno?\" \/><\/p>\n<p class=\"\">Uno: hay muchas diferencias entre Falcon y Puma. An\u00e1lisis HTTP, manejo de m\u00faltiples procesos, c\u00f3mo se escribe el reactor. Y, de hecho, ambos pasan mucho tiempo en c\u00f3digo que no es de Ruby a trav\u00e9s de nio4r , lo que le permite a Ruby usar algunas bibliotecas C (muy geniales, muy eficientes) para hacer el trabajo pesado. Eso es genial, y creo que es una elecci\u00f3n maravillosa &#8230; Pero no es realmente una evaluaci\u00f3n comparativa de Ruby, \u00bfverdad?<\/p>\n<\/div>\n<p class=\"\">No, necesitamos algo mucho m\u00e1s simple para ver el rendimiento de la fibra sin procesar.<\/p>\n<p class=\"\">Adem\u00e1s, Ruby 3&#215;3 usa Ruby 2.0 como l\u00ednea de base. Falcon, nio4r y Puma reciente requieren razonablemente Ruby m\u00e1s reciente que eso. Cualquiera que sea el punto de referencia que use, quiero poder comparar todo el camino hasta Ruby 2.0. Puma 2.11 puede hacer eso, pero ninguna versi\u00f3n de Falcon puede hacerlo.<\/p>\n<h2 id=\"yui_3_17_2_1_1575551499834_533\"><span id=\"yui_3_17_2_1_1575551499834_532\"><span id=\"yui_3_17_2_1_1575551499834_531\">Algunos enfoques que no funcionaron<\/span><\/span><\/h2>\n<p class=\"\">\u00bfSolo te interesa el remate? Salta esta secci\u00f3n. \u00bfCurioso sobre la metodolog\u00eda? Sigue leyendo.<\/p>\n<p class=\"\">Intent\u00e9 armar un cliente y servidor HTTP <strong><em>realmente<\/em><\/strong> simple. El cliente estaba inicialmente inestable mientras que el servidor era en realidad tres servidores diferentes: un subproceso, un proceso y una fibra. Lo tengo en parte funcionando<\/p>\n<div id=\"block-yui_3_17_2_1_1567226523116_34965\" class=\"sqs-block html-block sqs-block-html\" data-block-type=\"2\">\n<div id=\"yui_3_17_2_1_1575551499834_534\" class=\"sqs-block-content\">\n<p class=\"\"><strong>Pero todo fall\u00f3<\/strong> . Mal.<\/p>\n<p class=\"\">Espec\u00edficamente, wrk es intencionalmente exigente y quisquilloso. Si el servidor cierra el socket demasiado pronto, da un error. Muchos errores Errores de lectura y errores de escritura, dependiendo. Simplemente es<\/p>\n<p><img decoding=\"async\" class=\"lazyload alignright\" src=\"data:image\/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\" data-orig-src=\"https:\/\/images.squarespace-cdn.com\/content\/v1\/562ea223e4b0e0b9dab0b930\/1567231114815-6U1V9X36WRP2L6E8U15Q\/ke17ZwdGBToddI8pDm48kAIpBGoK5JcuSKC_DsBpgtB7gQa3H78H3Y0txjaiv_0fDoOvxcdMmMKkDsyUqMSsMWxHk725yiiHCCLfrh8O1z5QHyNOqBUUEtDDsRWrJLTmru5j-AQBePNiDV9hZLaF5JOUuEiaVxxLukkqfBKamUy-I9Nn0pYju0iNV-WuYigV\/stages-of-failure-explained.jpg?format=500w\" alt=\"Si evito la estrategia y la visi\u00f3n, puedo reducir el alcance de mis fallas. Eso es lo correcto, estoy seguro.\" \/><\/p>\n<p class=\"\">cribir un servidor HTTP con Ruby&#8217;s TCPSocket es m\u00e1s dif\u00edcil de lo que parece, b\u00e1sicamente, si quiero que un cliente exigente lo trate como razonable. Curl piensa que est\u00e1 bien. Wrk quiere resultados de referencia limpios y dice que no.<\/p>\n<\/div>\n<\/div>\n<div id=\"block-yui_3_17_2_1_1567226523116_36669\" class=\"sqs-block image-block sqs-block-image sqs-col-6 span-6 float float-right sqs-text-ready\" data-block-type=\"5\">\n<div id=\"yui_3_17_2_1_1575551499834_105\" class=\"sqs-block-content\">\n<div id=\"yui_3_17_2_1_1575551499834_104\" class=\"image-block-outer-wrapper layout-caption-below design-layout-inline combination-animation-none individual-animation-none individual-text-animation-none sqs-narrow-width\">\n<div id=\"yui_3_17_2_1_1575551499834_103\" class=\"intrinsic\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<div id=\"block-yui_3_17_2_1_1567226523116_39956\" class=\"sqs-block html-block sqs-block-html\" data-block-type=\"2\">\n<div class=\"sqs-block-content\">\n<p class=\"\">Si, vale, bien. Creo que <strong><em>no<\/em><\/strong> quiero resultados de referencia limpias. Tal vez.<\/p>\n<p class=\"\">Eso tambi\u00e9n fall\u00f3.De acuerdo, entonces, \u00bftal vez solo un servidor de socket TCP? \u00bfCliente C r\u00e1pido y sin procesar, tres servidores diferentes basados \u200b\u200ben TCPServer, un subproceso, un proceso, una fibra? Tom\u00f3 algo de trabajo, pero hice todo eso .<\/p>\n<\/div>\n<p class=\"\">Eso tambi\u00e9n fall\u00f3.<\/p>\n<p class=\"\">Espec\u00edficamente, lo tengo todo trabajando con hilos: a menudo son los m\u00e1s f\u00e1ciles. Y una ejecuci\u00f3n de 10,000 solicitudes tom\u00f3 de 3 segundos a 30 segundos. Eso parece mucho. Pens\u00e9, bueno, tal vez los hilos son malos en esto, y lo prob\u00e9 con fibras. El mismo problema.<\/p>\n<p class=\"\">As\u00ed que lo prob\u00e9 con c\u00f3digo lineal no concurrente para el servidor. El mismo problema. \u00bfQu\u00e9 pasa con un reactor simple basado en selecci\u00f3n para la versi\u00f3n de fibra para ver si algo de concurrencia ayuda? No El mismo problema.<\/p>\n<p class=\"\">Resulta que solo abrir un socket TCP \/ IP, incluso en localhost, agrega una <strong>gran<\/strong> cantidad de variaci\u00f3n al tiempo para la prueba. <span class=\"goog-text-highlight\">Tanta variaci\u00f3n que inunda lo que estoy tratando de medir. <\/span>Me <em>podr\u00eda<\/em> haber simplemente correr muchos, muchos ensayos a (en su mayor\u00eda) media el ruido. Pero tener m\u00e1s ruido de medici\u00f3n que se\u00f1al para medir es una muy mala idea.<\/p>\n<p class=\"\">Entonces: de <strong>vuelta al tablero de dibujo<\/strong> .<\/p>\n<p class=\"\">Sin HTTP Sin TCP No hay grandes servidores de aplicaciones complicados, por lo que no podr\u00eda ir <em>m\u00e1s<\/em> complicado.<\/p>\n<p class=\"\">\u00bfQu\u00e9 fue lo siguiente?<\/p>\n<h2>Menos complicado<\/h2>\n<p class=\"\">\u00bfQu\u00e9 es m\u00e1s predecible y menos variable que los sockets TCP \/ IP? Sockets locales de proceso a proceso sin protocolo de red en el medio. En Ruby, una forma f\u00e1cil de hacerlo es IO.pipe.\u00a0 <img decoding=\"async\" class=\"lazyload alignright\" src=\"data:image\/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\" data-orig-src=\"https:\/\/images.squarespace-cdn.com\/content\/v1\/562ea223e4b0e0b9dab0b930\/1567231321410-GOTGODI4BW8OIDGKMYLV\/ke17ZwdGBToddI8pDm48kFpj-M3FQzDSZkbxjM2LNh1Zw-zPPgdn4jUwVcJE1ZvWEtT5uBSRWt4vQZAgTJucoTqqXjS3CfNDSuuf31e0tVGC6bE_SWEnuQukI4B0vZi6-hgnIUQxzQJsyAM4ROjz4hur-lC0WofN0YB1wFg-ZW0\/empirical_usage.png?format=500w\" alt=\"Estoy empezando a disfrutar de cu\u00e1n tremendamente malas son las explicaciones visuales de los tubos de carcasa. Tal vez esa es una forma de s\u00edndrome de Estocolmo?\" \/><\/p>\n<p class=\"\">Puede armar un patr\u00f3n maestro \/ trabajador simple bastante agradable haciendo que el maestro configure un grupo de trabajadores, cada uno con una tuber\u00eda en forma de concha. Es muy r\u00e1pido de configurar y muy r\u00e1pido de usar. Esta es la misma forma en que shells como bash configura operadores de tuber\u00eda para \u00abcat myfile | sort | uniq\u00bb para ejecutar la salida a trav\u00e9s de varios programas antes de que se haga.<\/p>\n<p class=\"\">Entonces eso fue lo que hice. Us\u00e9 hilos como trabajadores para la primera versi\u00f3n. El c\u00f3digo para eso es bastante simple.<\/p>\n<\/div>\n<p class=\"\">B\u00e1sicamente:<\/p>\n<ul data-rte-list=\"default\">\n<li>\n<p class=\"\">Configurar tuber\u00edas de lectura y escritura<\/p>\n<\/li>\n<li>\n<p class=\"\">Configure hilos como trabajadores, listos para leer y escribir<\/p>\n<\/li>\n<li>\n<p class=\"\">Inicie el c\u00f3digo maestro \/ controlador en el proceso principal de Ruby y el hilo<\/p>\n<\/li>\n<li>\n<p class=\"\">Sigue corriendo hasta que termines, luego limpia<\/p>\n<\/li>\n<\/ul>\n<p class=\"\">Hay un breve c\u00f3digo del reactor para el maestro para asegurarse de que solo lee y escribe en las tuber\u00edas que est\u00e1n actualmente listas. Pero es muy corto, ciertamente bajo diez l\u00edneas de \u00abextra\u00bb.<\/p>\n<p class=\"\">La versi\u00f3n multiproceso es apenas diferente: es tan similar que hay aproximadamente cinco l\u00edneas de diferencia entre ellas .<\/p>\n<h2>Y ahora, fibras<\/h2>\n<p class=\"\">La versi\u00f3n de fibra es un poco m\u00e1s complicada. Hablemos de eso.<\/p>\n<p class=\"\">Subprocesos y procesos tienen multitarea preventiva . Por lo tanto, si configura uno de ellos y se olvida de \u00e9l, sucede lo correcto. Tu maestro y tus trabajadores intercambiar\u00e1n bastante bien entre ellos. No todo funciona perfectamente todo el tiempo, pero las cosas b\u00e1sicamente tienden a funcionar bien.<\/p>\n<\/div>\n<p class=\"\">Las fibras son diferentes. Una fibra tiene que ceder el control manualmente cuando se hace. Si una fibra solo lee o escribe en el momento incorrecto, puede bloquear todo el programa hasta que est\u00e9 listo. Ese no <em>es<\/em> un problema <em>tan grave<\/em> con IO.pipe como con TCP \/ IP. Pero <img decoding=\"async\" class=\"lazyload alignright\" src=\"data:image\/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\" data-orig-src=\"https:\/\/images.squarespace-cdn.com\/content\/v1\/562ea223e4b0e0b9dab0b930\/1567231557907-YPZQ4ZUCVMMX0UFJN7J5\/ke17ZwdGBToddI8pDm48kFnRiW_XPVD6u2rYxPQzgNZZw-zPPgdn4jUwVcJE1ZvWQUxwkmyExglNqGp0IvTJZamWLI2zvYWH8K3-s_4yszcp2ryTI0HqTOaaUohrI8PIsOovC4BBkp8fVtbSoQ_Xszq1ihxA-M7wCRf5QsXn9fIKMshLAGzx4R3EDFOm1kBS\/getty_525935645_183646.jpg?format=500w\" alt=\"En la multitarea cooperativa, mantiene la sonrisa tonta en su rostro y cambia cuando lo desea. En la multitarea preventiva, no puede pasar demasiado tiempo en el tel\u00e9fono celular o la mano con el libro lo abofetea.\" \/>sigue siendo una buena idea usar un patr\u00f3n llamado reactor para asegurarse de que solo est\u00e1 leyendo cuando hay datos disponibles y solo escribiendo cuando hay espacio en la tuber\u00eda para ello.<\/p>\n<p class=\"\">Samuel Williams tiene una presentaci\u00f3n sobre las fibras de Ruby que utilic\u00e9 mucho como fuente para esta publicaci\u00f3n. Incluye un patr\u00f3n de reactor simple para fibras que usar\u00e9 para clasificar a mis trabajadores. Al igual que el maestro en el c\u00f3digo anterior, este reactor usa IO.select para averiguar cu\u00e1ndo leer y escribir y c\u00f3mo transferir el control entre las diferentes fibras. El patr\u00f3n del reactor tambi\u00e9n se puede usar para hilos o procesos, pero el c\u00f3digo de Samuel est\u00e1 escrito para fibras.<\/p>\n<p id=\"yui_3_17_2_1_1575552277986_519\" class=\"\">Inicialmente, puse a todos los trabajadores en un reactor en un hilo, y el maestro con un reactor IO.select en otro hilo . Eso es muy similar a c\u00f3mo se configura el hilo y el c\u00f3digo de proceso, por lo que es claramente comparable. Pero result\u00f3 que el rendimiento de esa versi\u00f3n no es excelente.<\/p>\n<div id=\"block-yui_3_17_2_1_1567226523116_86054\" class=\"sqs-block html-block sqs-block-html\" data-block-type=\"2\">\n<div id=\"yui_3_17_2_1_1575552277986_517\" class=\"sqs-block-content\">\n<p class=\"\">Pero parece una tonter\u00eda decir que est\u00e1 probando fibras mientras usa hilos para cambiar de un lado a otro &#8230; As\u00ed que escrib\u00ed una versi\u00f3n \u00abremasterizada\u00bb del c\u00f3digo, con el c\u00f3digo maestro usando una fibra por trabajador. \u00bfSer\u00eda esto realmente lento ya que duplicaba el n\u00famero de fibras &#8230;? No tanto.<\/p>\n<p class=\"\">De hecho, usar solo fibras y un solo reactor duplic\u00f3 la velocidad para grandes cantidades de mensajes.<\/p>\n<p class=\"\">Y con eso, tuve un buen c\u00f3digo de hilo, proceso y fibra comparable que es casi todo E \/ S.<\/p>\n<h2>\u00bfC\u00f3mo se realiza?<\/h2>\n<p class=\"\">Lo puse a prueba localmente en mi Macbook Pro con Ruby 2.6.2. Tome esto como un desempe\u00f1o \u00abvagamente sugestivo\u00bb, en otras palabras, no como un desempe\u00f1o \u00abmuy investigado\u00bb. Pero creo que da un comienzo razonable. Validar\u00e9 en instancias m\u00e1s grandes de Linux EC2 antes de que te des cuenta, nos hemos conocido antes.<\/p>\n<p class=\"\">Aqu\u00ed hay una cantidad de trabajadores y solicitudes junto con el tipo de trabajador y cu\u00e1nto tiempo lleva procesar esa cantidad de solicitudes:<\/p>\n<\/div>\n<\/div>\n<div id=\"block-yui_3_17_2_1_1567226523116_122580\" class=\"sqs-block code-block sqs-block-code\" data-block-type=\"23\">\n<div class=\"sqs-block-content\">\n<table id=\"yui_3_17_2_1_1575552277986_531\">\n<thead>\n<tr>\n<th><\/th>\n<th>Trapos<\/th>\n<th>Procesos<\/th>\n<th>Fibras con Master de estilo antiguo<\/th>\n<th>Fibras con Fast Master<\/th>\n<\/tr>\n<\/thead>\n<tbody id=\"yui_3_17_2_1_1575552277986_530\">\n<tr>\n<th>5 trabajadores con 20,000 requisitos cada uno<\/th>\n<td>2.6<\/td>\n<td>0.71<\/td>\n<td>4.2<\/td>\n<td>1.9<\/td>\n<\/tr>\n<tr id=\"yui_3_17_2_1_1575552277986_529\">\n<th id=\"yui_3_17_2_1_1575552277986_528\"><span id=\"yui_3_17_2_1_1575552277986_527\"><span id=\"yui_3_17_2_1_1575552277986_526\">10 trabajadores con 10,000 requisitos cada uno<\/span><\/span><\/th>\n<td>2.5<\/td>\n<td>0.67<\/td>\n<td>4.0<\/td>\n<td>1.7<\/td>\n<\/tr>\n<tr>\n<th>100 trabajadores con 1,000 requisitos cada uno<\/th>\n<td>2.5<\/td>\n<td>0.76<\/td>\n<td>3.9<\/td>\n<td>1.6<\/td>\n<\/tr>\n<tr>\n<th>1000 trabajadores con 100 requisitos cada uno<\/th>\n<td>2.8<\/td>\n<td>2.5<\/td>\n<td>5.0<\/td>\n<td>2.4<\/td>\n<\/tr>\n<tr>\n<th><\/th>\n<\/tr>\n<tr>\n<th><span class=\"\">10 trabajadores con 100,000 requisitos cada uno<\/span><\/th>\n<td>25<\/td>\n<td>5.8<\/td>\n<td>41<\/td>\n<td>16<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p class=\"\">Algunas notas r\u00e1pidas: los procesos dan una muestra <strong><em>sorprendente<\/em><\/strong> , en parte porque no tienen GIL. Los hilos superan a las fibras con un maestro roscado, por lo que <em>combinar<\/em> hilos y fibras demasiado cerca parece ser dudoso. Pero con un maestro basado en fibra adecuado, son m\u00e1s r\u00e1pidos que los hilos, como es de esperar y esperar.<\/p>\n<p class=\"\"><span class=\"\">Tambi\u00e9n puede notar que los procesos <\/span><strong><em><span class=\"\">no se<\/span><\/em><\/strong><span class=\"\"> escalan correctamente a 1000 trabajadores, mientras que los hilos y las fibras funcionan mucho mejor. <\/span>Eso es normal y esperado, pero es bueno ver que los datos lo confirman.<\/p>\n<p class=\"\">Esa fila final tiene 10 veces m\u00e1s solicitudes totales que todas las otras filas. Por eso sus n\u00fameros son aproximadamente diez veces m\u00e1s altos.<\/p>\n<h2>Una base s\u00f3lida para el rendimiento<\/h2>\n<p><img decoding=\"async\" class=\"lazyload alignleft\" src=\"data:image\/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\" data-orig-src=\"https:\/\/images.squarespace-cdn.com\/content\/v1\/562ea223e4b0e0b9dab0b930\/1567231432199-P22HENX35FBDFMVQ8UNG\/ke17ZwdGBToddI8pDm48kFr-MCz83LG2ZqzGFu9uALUUqsxRUqqbr1mOJYKfIPR7LoDQ9mXPOjoJoqy81S2I8N_N4V1vUb5AoIIIbLZhVYxCRW4BPu10St3TBAUQYVKcf42APUzg73I6BbvkUSZBpJhcOgRzHbaVuNgQSOKA8C5AwPhW16geOHSxinwWbjVI\/personal-success-change-your-life-keys-to-success2.jpg?format=500w\" alt=\"Este tipo acaba de obtener el c\u00f3digo de Ruby Fiber para trabajar. Se nota por la postura.\" \/><\/p>\n<p class=\"\">Este art\u00edculo es definitivamente lo suficientemente largo, as\u00ed que no probar\u00e9 esto desde la versi\u00f3n 2.0 de Ruby a 2.7 &#8230; A\u00fan. \u00a1Sin embargo, puede esperarlo pronto!<\/p>\n<p class=\"\">Queremos mostrar que el rendimiento de la fibra ha mejorado con el tiempo, y nos gustar\u00eda ver si los hilos o procesos han cambiado mucho. As\u00ed que probaremos esas versiones de Ruby.<\/p>\n<p class=\"\">Tambi\u00e9n queremos comparar hilos, procesos y fibras en diferentes niveles de concurrencia. Esta no es una prueba perfectamente justa. \u00a1No hay tal cosa! Pero a\u00fan puede ense\u00f1arnos algo \u00fatil.<\/p>\n<p class=\"\">Y tambi\u00e9n nos gustar\u00eda una l\u00ednea de base para comenzar a analizar varias propuestas de \u00abautofibra\u00bb: variaciones en las fibras que producen autom\u00e1ticamente al hacer E \/ S para que no necesite la envoltura adicional del reactor para lecturas y escrituras. Eso simplifica sustancialmente el c\u00f3digo, dando algo mucho m\u00e1s parecido al hilo o al c\u00f3digo de proceso. Hay al menos dos propuestas de autofibra, una de Eric Wong y otra de Samuel Williams .<\/p>\n<p class=\"\">No esperes todo eso para la misma publicaci\u00f3n de blog, por supuesto. Pero el trabajo de fondo que acabamos de hacer prepara el escenario para todo.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div><\/div><\/div><\/div><\/div>","protected":false},"excerpt":{"rendered":"","protected":false},"author":9,"featured_media":4135,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"content-type":"","footnotes":""},"categories":[32],"tags":[],"class_list":["post-4133","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blog"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v21.7 (Yoast SEO v27.6) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Benchmarking de fibras, hilos y procesos - TCIT<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.tcit.cl\/ingles\/benchmarking-de-fibras-hilos-y-procesos\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Benchmarking de fibras, hilos y procesos\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.tcit.cl\/ingles\/benchmarking-de-fibras-hilos-y-procesos\/\" \/>\n<meta property=\"og:site_name\" content=\"TCIT\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/web.facebook.com\/tcitcloudsolutions\/\" \/>\n<meta property=\"article:published_time\" content=\"2019-12-05T13:13:02+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-04-26T19:29:32+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.tcit.cl\/wp-content\/uploads\/2019\/12\/25-ruby.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1100\" \/>\n\t<meta property=\"og:image:height\" content=\"750\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Gonzalo Burgos\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Gonzalo Burgos\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"17 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.tcit.cl\\\/benchmarking-de-fibras-hilos-y-procesos\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.tcit.cl\\\/benchmarking-de-fibras-hilos-y-procesos\\\/\"},\"author\":{\"name\":\"Gonzalo Burgos\",\"@id\":\"https:\\\/\\\/www.tcit.cl\\\/#\\\/schema\\\/person\\\/3feac3eca66491ec20151f9127ed7ea1\"},\"headline\":\"Benchmarking de fibras, hilos y procesos\",\"datePublished\":\"2019-12-05T13:13:02+00:00\",\"dateModified\":\"2023-04-26T19:29:32+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.tcit.cl\\\/benchmarking-de-fibras-hilos-y-procesos\\\/\"},\"wordCount\":2638,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.tcit.cl\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.tcit.cl\\\/benchmarking-de-fibras-hilos-y-procesos\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.tcit.cl\\\/wp-content\\\/uploads\\\/2019\\\/12\\\/25-ruby.jpg\",\"articleSection\":[\"Blog\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.tcit.cl\\\/benchmarking-de-fibras-hilos-y-procesos\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.tcit.cl\\\/benchmarking-de-fibras-hilos-y-procesos\\\/\",\"url\":\"https:\\\/\\\/www.tcit.cl\\\/benchmarking-de-fibras-hilos-y-procesos\\\/\",\"name\":\"Benchmarking de fibras, hilos y procesos - TCIT\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.tcit.cl\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.tcit.cl\\\/benchmarking-de-fibras-hilos-y-procesos\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.tcit.cl\\\/benchmarking-de-fibras-hilos-y-procesos\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.tcit.cl\\\/wp-content\\\/uploads\\\/2019\\\/12\\\/25-ruby.jpg\",\"datePublished\":\"2019-12-05T13:13:02+00:00\",\"dateModified\":\"2023-04-26T19:29:32+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.tcit.cl\\\/benchmarking-de-fibras-hilos-y-procesos\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.tcit.cl\\\/benchmarking-de-fibras-hilos-y-procesos\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.tcit.cl\\\/benchmarking-de-fibras-hilos-y-procesos\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.tcit.cl\\\/wp-content\\\/uploads\\\/2019\\\/12\\\/25-ruby.jpg\",\"contentUrl\":\"https:\\\/\\\/www.tcit.cl\\\/wp-content\\\/uploads\\\/2019\\\/12\\\/25-ruby.jpg\",\"width\":1100,\"height\":750},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.tcit.cl\\\/benchmarking-de-fibras-hilos-y-procesos\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Portada\",\"item\":\"https:\\\/\\\/www.tcit.cl\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Benchmarking de fibras, hilos y procesos\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.tcit.cl\\\/#website\",\"url\":\"https:\\\/\\\/www.tcit.cl\\\/\",\"name\":\"https:\\\/\\\/www.tcit.cl\\\/\",\"description\":\"AI Solutions\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.tcit.cl\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.tcit.cl\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.tcit.cl\\\/#organization\",\"name\":\"TCIT EIRL\",\"alternateName\":\"TCIT AI Solutions\",\"url\":\"https:\\\/\\\/www.tcit.cl\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.tcit.cl\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.tcit.cl\\\/wp-content\\\/uploads\\\/2025\\\/09\\\/cropped-TCIT_isotipo-color.png\",\"contentUrl\":\"https:\\\/\\\/www.tcit.cl\\\/wp-content\\\/uploads\\\/2025\\\/09\\\/cropped-TCIT_isotipo-color.png\",\"width\":512,\"height\":512,\"caption\":\"TCIT EIRL\"},\"image\":{\"@id\":\"https:\\\/\\\/www.tcit.cl\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/web.facebook.com\\\/tcitcloudsolutions\\\/\",\"https:\\\/\\\/www.instagram.com\\\/tcitcloudsolutions\\\/\",\"https:\\\/\\\/www.linkedin.com\\\/company\\\/tcit-cloud-solutions\\\/\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.tcit.cl\\\/#\\\/schema\\\/person\\\/3feac3eca66491ec20151f9127ed7ea1\",\"name\":\"Gonzalo Burgos\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/e2d4d08554b58b6bdc8ddfc801c6b583fb9207e71f73b8a119ced6a71fc814d0?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/e2d4d08554b58b6bdc8ddfc801c6b583fb9207e71f73b8a119ced6a71fc814d0?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/e2d4d08554b58b6bdc8ddfc801c6b583fb9207e71f73b8a119ced6a71fc814d0?s=96&d=mm&r=g\",\"caption\":\"Gonzalo Burgos\"},\"url\":\"https:\\\/\\\/www.tcit.cl\\\/ingles\\\/author\\\/eduardo-albornoz-2\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Benchmarking de fibras, hilos y procesos - TCIT","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.tcit.cl\/ingles\/benchmarking-de-fibras-hilos-y-procesos\/","og_locale":"en_US","og_type":"article","og_title":"Benchmarking de fibras, hilos y procesos","og_url":"https:\/\/www.tcit.cl\/ingles\/benchmarking-de-fibras-hilos-y-procesos\/","og_site_name":"TCIT","article_publisher":"https:\/\/web.facebook.com\/tcitcloudsolutions\/","article_published_time":"2019-12-05T13:13:02+00:00","article_modified_time":"2023-04-26T19:29:32+00:00","og_image":[{"width":1100,"height":750,"url":"https:\/\/www.tcit.cl\/wp-content\/uploads\/2019\/12\/25-ruby.jpg","type":"image\/jpeg"}],"author":"Gonzalo Burgos","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Gonzalo Burgos","Est. reading time":"17 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.tcit.cl\/benchmarking-de-fibras-hilos-y-procesos\/#article","isPartOf":{"@id":"https:\/\/www.tcit.cl\/benchmarking-de-fibras-hilos-y-procesos\/"},"author":{"name":"Gonzalo Burgos","@id":"https:\/\/www.tcit.cl\/#\/schema\/person\/3feac3eca66491ec20151f9127ed7ea1"},"headline":"Benchmarking de fibras, hilos y procesos","datePublished":"2019-12-05T13:13:02+00:00","dateModified":"2023-04-26T19:29:32+00:00","mainEntityOfPage":{"@id":"https:\/\/www.tcit.cl\/benchmarking-de-fibras-hilos-y-procesos\/"},"wordCount":2638,"commentCount":0,"publisher":{"@id":"https:\/\/www.tcit.cl\/#organization"},"image":{"@id":"https:\/\/www.tcit.cl\/benchmarking-de-fibras-hilos-y-procesos\/#primaryimage"},"thumbnailUrl":"https:\/\/www.tcit.cl\/wp-content\/uploads\/2019\/12\/25-ruby.jpg","articleSection":["Blog"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.tcit.cl\/benchmarking-de-fibras-hilos-y-procesos\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.tcit.cl\/benchmarking-de-fibras-hilos-y-procesos\/","url":"https:\/\/www.tcit.cl\/benchmarking-de-fibras-hilos-y-procesos\/","name":"Benchmarking de fibras, hilos y procesos - TCIT","isPartOf":{"@id":"https:\/\/www.tcit.cl\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.tcit.cl\/benchmarking-de-fibras-hilos-y-procesos\/#primaryimage"},"image":{"@id":"https:\/\/www.tcit.cl\/benchmarking-de-fibras-hilos-y-procesos\/#primaryimage"},"thumbnailUrl":"https:\/\/www.tcit.cl\/wp-content\/uploads\/2019\/12\/25-ruby.jpg","datePublished":"2019-12-05T13:13:02+00:00","dateModified":"2023-04-26T19:29:32+00:00","breadcrumb":{"@id":"https:\/\/www.tcit.cl\/benchmarking-de-fibras-hilos-y-procesos\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.tcit.cl\/benchmarking-de-fibras-hilos-y-procesos\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.tcit.cl\/benchmarking-de-fibras-hilos-y-procesos\/#primaryimage","url":"https:\/\/www.tcit.cl\/wp-content\/uploads\/2019\/12\/25-ruby.jpg","contentUrl":"https:\/\/www.tcit.cl\/wp-content\/uploads\/2019\/12\/25-ruby.jpg","width":1100,"height":750},{"@type":"BreadcrumbList","@id":"https:\/\/www.tcit.cl\/benchmarking-de-fibras-hilos-y-procesos\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Portada","item":"https:\/\/www.tcit.cl\/"},{"@type":"ListItem","position":2,"name":"Benchmarking de fibras, hilos y procesos"}]},{"@type":"WebSite","@id":"https:\/\/www.tcit.cl\/#website","url":"https:\/\/www.tcit.cl\/","name":"https:\/\/www.tcit.cl\/","description":"AI Solutions","publisher":{"@id":"https:\/\/www.tcit.cl\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.tcit.cl\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.tcit.cl\/#organization","name":"TCIT EIRL","alternateName":"TCIT AI Solutions","url":"https:\/\/www.tcit.cl\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.tcit.cl\/#\/schema\/logo\/image\/","url":"https:\/\/www.tcit.cl\/wp-content\/uploads\/2025\/09\/cropped-TCIT_isotipo-color.png","contentUrl":"https:\/\/www.tcit.cl\/wp-content\/uploads\/2025\/09\/cropped-TCIT_isotipo-color.png","width":512,"height":512,"caption":"TCIT EIRL"},"image":{"@id":"https:\/\/www.tcit.cl\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/web.facebook.com\/tcitcloudsolutions\/","https:\/\/www.instagram.com\/tcitcloudsolutions\/","https:\/\/www.linkedin.com\/company\/tcit-cloud-solutions\/"]},{"@type":"Person","@id":"https:\/\/www.tcit.cl\/#\/schema\/person\/3feac3eca66491ec20151f9127ed7ea1","name":"Gonzalo Burgos","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/e2d4d08554b58b6bdc8ddfc801c6b583fb9207e71f73b8a119ced6a71fc814d0?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/e2d4d08554b58b6bdc8ddfc801c6b583fb9207e71f73b8a119ced6a71fc814d0?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/e2d4d08554b58b6bdc8ddfc801c6b583fb9207e71f73b8a119ced6a71fc814d0?s=96&d=mm&r=g","caption":"Gonzalo Burgos"},"url":"https:\/\/www.tcit.cl\/ingles\/author\/eduardo-albornoz-2\/"}]}},"_links":{"self":[{"href":"https:\/\/www.tcit.cl\/ingles\/wp-json\/wp\/v2\/posts\/4133","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.tcit.cl\/ingles\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.tcit.cl\/ingles\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.tcit.cl\/ingles\/wp-json\/wp\/v2\/users\/9"}],"replies":[{"embeddable":true,"href":"https:\/\/www.tcit.cl\/ingles\/wp-json\/wp\/v2\/comments?post=4133"}],"version-history":[{"count":0,"href":"https:\/\/www.tcit.cl\/ingles\/wp-json\/wp\/v2\/posts\/4133\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.tcit.cl\/ingles\/wp-json\/wp\/v2\/media\/4135"}],"wp:attachment":[{"href":"https:\/\/www.tcit.cl\/ingles\/wp-json\/wp\/v2\/media?parent=4133"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.tcit.cl\/ingles\/wp-json\/wp\/v2\/categories?post=4133"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.tcit.cl\/ingles\/wp-json\/wp\/v2\/tags?post=4133"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}