{"id":398,"date":"2016-04-10T20:59:17","date_gmt":"2016-04-10T18:59:17","guid":{"rendered":"http:\/\/tomaszkacmajor.pl\/?p=398"},"modified":"2016-04-30T18:12:07","modified_gmt":"2016-04-30T16:12:07","slug":"petle-rownolegle","status":"publish","type":"post","link":"https:\/\/tomaszkacmajor.pl\/index.php\/2016\/04\/10\/petle-rownolegle\/","title":{"rendered":"P\u0119tle r\u00f3wnoleg\u0142e"},"content":{"rendered":"<p>Od jakiego\u015b czasu programi\u015bci platformy .NET, a w\u0142a\u015bciwie jej wersji nr 4.0 maj\u0105 mo\u017cliwo\u015b\u0107 zastosowania biblioteki <em>Task Parallel Library<\/em>. Jej najpopularniejszym elementem jest wsp\u00f3\u0142bie\u017cna p\u0119tla For, kt\u00f3r\u0105 bardzo intuicyjnie si\u0119 obs\u0142uguje. Tak\u0105 r\u00f3wnoleg\u0142\u0105 p\u0119tl\u0119 otrzymujemy dzi\u0119ki metodzie <strong>Parallel.For<\/strong>().<br \/>\n<!--more--><\/p>\n<p>Okazuje si\u0119, \u017ce eksploracja publicznie dost\u0119pnych bibliotek jest bardzo kszta\u0142c\u0105ca. Podczas dopisywania w\u0142asnych funkcji do biblioteki Accord.net zwi\u0105zanych z segmentacj\u0105 <a href=\"http:\/\/tomaszkacmajor.pl\/index.php\/2016\/04\/03\/slic-superpiksele\/\" target=\"_blank\">SLIC<\/a> zauwa\u017cy\u0142em, \u017ce bardzo cz\u0119sto autorzy u\u017cywaj\u0105 r\u00f3wnoleg\u0142ych p\u0119tli. To logiczne, \u017ce proste operacje wykonywane na ka\u017cdym pikselu z osobna b\u0119d\u0105 o wiele szybsze je\u015bli uruchomimy je r\u00f3wnolegle. Dotychczas troch\u0119 obawia\u0142em si\u0119 stosowania wsp\u00f3\u0142bie\u017cno\u015bci, gdy\u017c jest to jednak zwi\u0105zane z wieloma zagro\u017ceniami a poza tym nigdy nie by\u0142o takiej potrzeby. Zatem w ramach projektu <a href=\"http:\/\/tomaszkacmajor.pl\/index.php\/2016\/03\/19\/flover-project-4\/\" target=\"_blank\">Flover<\/a> czas si\u0119 z tym zaprzyja\u017ani\u0107, bo ju\u017c wiem, \u017ce si\u0119 bardzo op\u0142aca.<\/p>\n<p>Najcz\u0119\u015bciej u\u017cywana przeze mnie wersja metody Parallel.For ma nast\u0119puj\u0105c\u0105 definicj\u0119<\/p>\n<pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\r\npublic static ParallelLoopResult For(\r\n\tint fromInclusive,\r\n\tint toExclusive,\r\n\tAction&lt;int&gt; body\r\n)\r\n<\/pre>\n<p>Dwa pierwsze parametry okre\u015blaj\u0105 zakres zmiany indeksu p\u0119tli. Trzeci parametr jest delegatem, kt\u00f3ry bardzo cz\u0119sto podaje si\u0119 w postaci wyra\u017cenia lambda. To tam znajduje si\u0119 w\u0142a\u015bciwa cz\u0119\u015b\u0107 p\u0119tli, kt\u00f3rej zawarto\u015b\u0107 jest identyczna do normalnego Fora. Wi\u0119c je\u015bli chcieliby\u015bmy zamieni\u0107 klasyczn\u0105 p\u0119tl\u0119 for, kt\u00f3ra np. dodaje 1 do ka\u017cdego elementu tablicy:<\/p>\n<pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\r\nfor (int i = 0; i &lt; table.Length; i++)\r\n{\r\n  table&#x5B;i]++;\r\n}\r\n<\/pre>\n<p>nasza zr\u00f3wnoleglona p\u0119tla b\u0119dzie wygl\u0105da\u0142a tak:<\/p>\n<pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\r\nParallel.For(0, table.Length, i =&gt;\r\n{\r\n  table&#x5B;i]++;\r\n});\r\n<\/pre>\n<p>Dla tak prostej operacji mo\u017ce nie b\u0119dzie si\u0119 to zbytnio op\u0142aca\u0142o czasowo, ale to tylko przyk\u0142ad. Sp\u00f3jrzmy jak wygl\u0105da implementacja Parallel.For w moim projekcie. Chodzi tu o to, \u017ceby przypisa\u0107 ka\u017cdemu pikselowi z tablicy <em>data<\/em> znacznik segmentu z tablicy <em>label<\/em>. Nast\u0119pnie, dla centr\u00f3w segment\u00f3w z tablicy <em>newCentroids<\/em> kumulujemy warto\u015bci pikseli do nich nale\u017c\u0105cych.  <\/p>\n<pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\r\nParallel.For(0, data.Length, i =&gt;\r\n{               \r\n    double&#x5B;] point = data&#x5B;i];\r\n\r\n    double weight = weights&#x5B;i];\r\n    int label = labels&#x5B;i];\r\n\r\n    double&#x5B;] centroid = newCentroids&#x5B;label];\r\n\r\n   lock (syncObjects&#x5B;label])\r\n   {\r\n      count&#x5B;label] += weight;\r\n\r\n      for (int j = 0; j &lt; point.Length; j++)\r\n        centroid&#x5B;j] += point&#x5B;j] * weight;\r\n   }\r\n});\r\n<\/pre>\n<p>Zauwa\u017cmy, \u017ce u\u017cyto tutaj wyra\u017cenia lock (syncObjects[label]). Oznacza to, \u017ce operacje wykonywane w klamrach po wyra\u017ceniu lock nie b\u0119d\u0105 si\u0119 wykonywa\u0142y jednocze\u015bnie dla tej samej instancji obiektu <em>label<\/em>. <\/p>\n<p>Na koniec zobaczmy jak u\u017cycie Parallel.For wp\u0142ywa na moj\u0105 segmentacj\u0119 obrazu. W jej implementacji znajduje si\u0119 kilka takich p\u0119tli. Gdy wszystkie s\u0105 klasycznymi Forami czas przetwarzania obrazu (419&#215;500 pikseli) wynosi ok. 3.5 sekundy. Po zamianie p\u0119tli na ich wsp\u00f3\u0142bie\u017cne odpowiedniki czas skr\u00f3ci\u0142 si\u0119 do 1 sekundy.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/tomaszkacmajor.pl\/wp-content\/uploads\/2016\/04\/Parallel_comp.png\" alt=\"Parallel_comp\" width=\"1151\" height=\"881\" class=\"alignnone size-medium wp-image-405\" srcset=\"https:\/\/tomaszkacmajor.pl\/wp-content\/uploads\/2016\/04\/Parallel_comp.png 1151w, https:\/\/tomaszkacmajor.pl\/wp-content\/uploads\/2016\/04\/Parallel_comp-300x230.png 300w, https:\/\/tomaszkacmajor.pl\/wp-content\/uploads\/2016\/04\/Parallel_comp-768x588.png 768w, https:\/\/tomaszkacmajor.pl\/wp-content\/uploads\/2016\/04\/Parallel_comp-1024x784.png 1024w\" sizes=\"auto, (max-width: 1151px) 100vw, 1151px\" \/><\/p>\n<p>Nied\u0142ugo umieszcz\u0119 ca\u0142y kod segmentacji na GitHubie. Niestety na razie konieczne s\u0105 jeszcze ma\u0142e poprawki, aby segmentacja dzia\u0142a\u0142a niezawodnie.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Od jakiego\u015b czasu programi\u015bci platformy .NET, a w\u0142a\u015bciwie jej wersji nr 4.0 maj\u0105 mo\u017cliwo\u015b\u0107 zastosowania biblioteki Task Parallel Library. Jej najpopularniejszym elementem jest wsp\u00f3\u0142bie\u017cna p\u0119tla For, kt\u00f3r\u0105 bardzo intuicyjnie si\u0119 obs\u0142uguje. Tak\u0105 r\u00f3wnoleg\u0142\u0105 p\u0119tl\u0119 otrzymujemy dzi\u0119ki metodzie Parallel.For().<\/p>\n","protected":false},"author":1,"featured_media":399,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[13,12,11],"class_list":["post-398","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-flover-project","tag-c","tag-daj-sie-poznac","tag-flover"],"blocksy_meta":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v24.6 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>P\u0119tle r\u00f3wnoleg\u0142e - tomaszkacmajor.pl<\/title>\n<meta name=\"description\" content=\"Od wersji .NET 4.0 mamy mo\u017cliwo\u015b\u0107 zastosowania biblioteki TPL. Jej najpopularniejszym elementem jest p\u0119tla r\u00f3wnoleg\u0142a Parallel.For.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/tomaszkacmajor.pl\/index.php\/2016\/04\/10\/petle-rownolegle\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"P\u0119tle r\u00f3wnoleg\u0142e - tomaszkacmajor.pl\" \/>\n<meta property=\"og:description\" content=\"Od wersji .NET 4.0 mamy mo\u017cliwo\u015b\u0107 zastosowania biblioteki TPL. Jej najpopularniejszym elementem jest p\u0119tla r\u00f3wnoleg\u0142a Parallel.For.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/tomaszkacmajor.pl\/index.php\/2016\/04\/10\/petle-rownolegle\/\" \/>\n<meta property=\"og:site_name\" content=\"tomaszkacmajor.pl\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/ProggBlogg\/\" \/>\n<meta property=\"article:published_time\" content=\"2016-04-10T18:59:17+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2016-04-30T16:12:07+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/tomaszkacmajor.pl\/wp-content\/uploads\/2016\/04\/R\u00f3wnolegle_tory.png\" \/>\n\t<meta property=\"og:image:width\" content=\"697\" \/>\n\t<meta property=\"og:image:height\" content=\"338\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"tomasz.kacmajor\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@tkacmajor\" \/>\n<meta name=\"twitter:site\" content=\"@tkacmajor\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"tomasz.kacmajor\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"3 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/tomaszkacmajor.pl\/index.php\/2016\/04\/10\/petle-rownolegle\/\",\"url\":\"https:\/\/tomaszkacmajor.pl\/index.php\/2016\/04\/10\/petle-rownolegle\/\",\"name\":\"P\u0119tle r\u00f3wnoleg\u0142e - tomaszkacmajor.pl\",\"isPartOf\":{\"@id\":\"https:\/\/tomaszkacmajor.pl\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/tomaszkacmajor.pl\/index.php\/2016\/04\/10\/petle-rownolegle\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/tomaszkacmajor.pl\/index.php\/2016\/04\/10\/petle-rownolegle\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/tomaszkacmajor.pl\/wp-content\/uploads\/2016\/04\/R\u00f3wnolegle_tory.png\",\"datePublished\":\"2016-04-10T18:59:17+00:00\",\"dateModified\":\"2016-04-30T16:12:07+00:00\",\"author\":{\"@id\":\"https:\/\/tomaszkacmajor.pl\/#\/schema\/person\/5f40890309a32ae4f63fa6a284215b6c\"},\"description\":\"Od wersji .NET 4.0 mamy mo\u017cliwo\u015b\u0107 zastosowania biblioteki TPL. Jej najpopularniejszym elementem jest p\u0119tla r\u00f3wnoleg\u0142a Parallel.For.\",\"breadcrumb\":{\"@id\":\"https:\/\/tomaszkacmajor.pl\/index.php\/2016\/04\/10\/petle-rownolegle\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/tomaszkacmajor.pl\/index.php\/2016\/04\/10\/petle-rownolegle\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/tomaszkacmajor.pl\/index.php\/2016\/04\/10\/petle-rownolegle\/#primaryimage\",\"url\":\"https:\/\/tomaszkacmajor.pl\/wp-content\/uploads\/2016\/04\/R\u00f3wnolegle_tory.png\",\"contentUrl\":\"https:\/\/tomaszkacmajor.pl\/wp-content\/uploads\/2016\/04\/R\u00f3wnolegle_tory.png\",\"width\":697,\"height\":338},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/tomaszkacmajor.pl\/index.php\/2016\/04\/10\/petle-rownolegle\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Strona g\u0142\u00f3wna\",\"item\":\"https:\/\/tomaszkacmajor.pl\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"P\u0119tle r\u00f3wnoleg\u0142e\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/tomaszkacmajor.pl\/#website\",\"url\":\"https:\/\/tomaszkacmajor.pl\/\",\"name\":\"tomaszkacmajor.pl\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/tomaszkacmajor.pl\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/tomaszkacmajor.pl\/#\/schema\/person\/5f40890309a32ae4f63fa6a284215b6c\",\"name\":\"tomasz.kacmajor\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/tomaszkacmajor.pl\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/a1fe5c8a80549b9a680c7a6f9ea33a94?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/a1fe5c8a80549b9a680c7a6f9ea33a94?s=96&d=mm&r=g\",\"caption\":\"tomasz.kacmajor\"},\"url\":\"https:\/\/tomaszkacmajor.pl\/index.php\/author\/tomasz-kacmajor\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"P\u0119tle r\u00f3wnoleg\u0142e - tomaszkacmajor.pl","description":"Od wersji .NET 4.0 mamy mo\u017cliwo\u015b\u0107 zastosowania biblioteki TPL. Jej najpopularniejszym elementem jest p\u0119tla r\u00f3wnoleg\u0142a Parallel.For.","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:\/\/tomaszkacmajor.pl\/index.php\/2016\/04\/10\/petle-rownolegle\/","og_locale":"en_US","og_type":"article","og_title":"P\u0119tle r\u00f3wnoleg\u0142e - tomaszkacmajor.pl","og_description":"Od wersji .NET 4.0 mamy mo\u017cliwo\u015b\u0107 zastosowania biblioteki TPL. Jej najpopularniejszym elementem jest p\u0119tla r\u00f3wnoleg\u0142a Parallel.For.","og_url":"https:\/\/tomaszkacmajor.pl\/index.php\/2016\/04\/10\/petle-rownolegle\/","og_site_name":"tomaszkacmajor.pl","article_publisher":"https:\/\/www.facebook.com\/ProggBlogg\/","article_published_time":"2016-04-10T18:59:17+00:00","article_modified_time":"2016-04-30T16:12:07+00:00","og_image":[{"width":697,"height":338,"url":"https:\/\/tomaszkacmajor.pl\/wp-content\/uploads\/2016\/04\/R\u00f3wnolegle_tory.png","type":"image\/png"}],"author":"tomasz.kacmajor","twitter_card":"summary_large_image","twitter_creator":"@tkacmajor","twitter_site":"@tkacmajor","twitter_misc":{"Written by":"tomasz.kacmajor","Est. reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/tomaszkacmajor.pl\/index.php\/2016\/04\/10\/petle-rownolegle\/","url":"https:\/\/tomaszkacmajor.pl\/index.php\/2016\/04\/10\/petle-rownolegle\/","name":"P\u0119tle r\u00f3wnoleg\u0142e - tomaszkacmajor.pl","isPartOf":{"@id":"https:\/\/tomaszkacmajor.pl\/#website"},"primaryImageOfPage":{"@id":"https:\/\/tomaszkacmajor.pl\/index.php\/2016\/04\/10\/petle-rownolegle\/#primaryimage"},"image":{"@id":"https:\/\/tomaszkacmajor.pl\/index.php\/2016\/04\/10\/petle-rownolegle\/#primaryimage"},"thumbnailUrl":"https:\/\/tomaszkacmajor.pl\/wp-content\/uploads\/2016\/04\/R\u00f3wnolegle_tory.png","datePublished":"2016-04-10T18:59:17+00:00","dateModified":"2016-04-30T16:12:07+00:00","author":{"@id":"https:\/\/tomaszkacmajor.pl\/#\/schema\/person\/5f40890309a32ae4f63fa6a284215b6c"},"description":"Od wersji .NET 4.0 mamy mo\u017cliwo\u015b\u0107 zastosowania biblioteki TPL. Jej najpopularniejszym elementem jest p\u0119tla r\u00f3wnoleg\u0142a Parallel.For.","breadcrumb":{"@id":"https:\/\/tomaszkacmajor.pl\/index.php\/2016\/04\/10\/petle-rownolegle\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/tomaszkacmajor.pl\/index.php\/2016\/04\/10\/petle-rownolegle\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/tomaszkacmajor.pl\/index.php\/2016\/04\/10\/petle-rownolegle\/#primaryimage","url":"https:\/\/tomaszkacmajor.pl\/wp-content\/uploads\/2016\/04\/R\u00f3wnolegle_tory.png","contentUrl":"https:\/\/tomaszkacmajor.pl\/wp-content\/uploads\/2016\/04\/R\u00f3wnolegle_tory.png","width":697,"height":338},{"@type":"BreadcrumbList","@id":"https:\/\/tomaszkacmajor.pl\/index.php\/2016\/04\/10\/petle-rownolegle\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Strona g\u0142\u00f3wna","item":"https:\/\/tomaszkacmajor.pl\/"},{"@type":"ListItem","position":2,"name":"P\u0119tle r\u00f3wnoleg\u0142e"}]},{"@type":"WebSite","@id":"https:\/\/tomaszkacmajor.pl\/#website","url":"https:\/\/tomaszkacmajor.pl\/","name":"tomaszkacmajor.pl","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/tomaszkacmajor.pl\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/tomaszkacmajor.pl\/#\/schema\/person\/5f40890309a32ae4f63fa6a284215b6c","name":"tomasz.kacmajor","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/tomaszkacmajor.pl\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/a1fe5c8a80549b9a680c7a6f9ea33a94?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/a1fe5c8a80549b9a680c7a6f9ea33a94?s=96&d=mm&r=g","caption":"tomasz.kacmajor"},"url":"https:\/\/tomaszkacmajor.pl\/index.php\/author\/tomasz-kacmajor\/"}]}},"_links":{"self":[{"href":"https:\/\/tomaszkacmajor.pl\/index.php\/wp-json\/wp\/v2\/posts\/398","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/tomaszkacmajor.pl\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/tomaszkacmajor.pl\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/tomaszkacmajor.pl\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/tomaszkacmajor.pl\/index.php\/wp-json\/wp\/v2\/comments?post=398"}],"version-history":[{"count":12,"href":"https:\/\/tomaszkacmajor.pl\/index.php\/wp-json\/wp\/v2\/posts\/398\/revisions"}],"predecessor-version":[{"id":418,"href":"https:\/\/tomaszkacmajor.pl\/index.php\/wp-json\/wp\/v2\/posts\/398\/revisions\/418"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/tomaszkacmajor.pl\/index.php\/wp-json\/wp\/v2\/media\/399"}],"wp:attachment":[{"href":"https:\/\/tomaszkacmajor.pl\/index.php\/wp-json\/wp\/v2\/media?parent=398"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/tomaszkacmajor.pl\/index.php\/wp-json\/wp\/v2\/categories?post=398"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/tomaszkacmajor.pl\/index.php\/wp-json\/wp\/v2\/tags?post=398"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}