{"id":2268,"date":"2022-12-13T11:25:30","date_gmt":"2022-12-13T10:25:30","guid":{"rendered":"http:\/\/www.fabienm.eu\/flf\/?p=2268"},"modified":"2022-12-13T11:27:25","modified_gmt":"2022-12-13T10:27:25","slug":"un-timeout-dans-cocotb","status":"publish","type":"post","link":"http:\/\/www.fabienm.eu\/flf\/un-timeout-dans-cocotb\/","title":{"rendered":"Un timeout dans cocotb"},"content":{"rendered":"\n<p>Avec <a href=\"https:\/\/www.cocotb.org\/\">Cocotb<\/a> nous avons parfois des coroutines qui sont susceptible de rester \u00abcoinc\u00e9es\u00bb dans une boucle d&rsquo;attente infinie. Si l&rsquo;on y pr\u00eate pas garde, on a vite fait de remplir son disque dur de traces totalement inutile.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># Une coroutine qui attend bien trop longtemps\nasync def too_long_coroutine(self):\n    await Timer(1, units=\"sec\")<\/code><\/pre>\n\n\n\n<p>Pour \u00e9viter ce probl\u00e8me, l&rsquo;id\u00e9al serait de pouvoir ajouter un \u00abtimeout\u00bb \u00e0 l&rsquo;appel de la coroutine susceptible de bloquer. <\/p>\n\n\n\n<p>\u00c7a tombe bien, <strong>cocotb<\/strong> a pr\u00e9vu un <strong>trigger<\/strong> pour \u00e7a : <a href=\"https:\/\/docs.cocotb.org\/en\/stable\/triggers.html#cocotb.triggers.with_timeout\">with_timeout()<\/a><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>from cocotb.triggers import with_timeout\nawait with_timeout(testcls.too_long_coroutine(), 100, \"ns\")<\/code><\/pre>\n\n\n\n<p>Sauf que python n&rsquo;a pas trop l&rsquo;air d&rsquo;accord pour ex\u00e9cuter notre coroutine comme un trigger.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>TypeError: All triggers must be instances of Trigger! Got: coroutine<\/code><\/pre>\n\n\n\n<p>C&rsquo;est dommage, on perd beaucoup de l\u2019int\u00e9r\u00eat de ce trigger !<\/p>\n\n\n\n<p>La solution donn\u00e9e par <a href=\"https:\/\/github.com\/cocotb\/cocotb\/discussions\/2825\">marlonjames<\/a> est d&rsquo;\u00abempaquetter\u00bb la coroutine dans la fonction <code>start_soon()<\/code> comme ceci :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>await with_timeout(\n     cocotb.start_soon(testcls.too_long_coroutine()),\n     100, \"ns\")<\/code><\/pre>\n\n\n\n<p>De cette mani\u00e8re, le test s&rsquo;interromps sur une lev\u00e9 d&rsquo;interruption <code>SimTimeoutError<\/code> et le test est marqu\u00e9 <code>FAIL<\/code> sans ruiner notre disque dur.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>    raise cocotb.result.SimTimeoutError\ncocotb.result.SimTimeoutError<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Avec Cocotb nous avons parfois des coroutines qui sont susceptible de rester \u00abcoinc\u00e9es\u00bb dans une boucle d&rsquo;attente infinie. Si l&rsquo;on y pr\u00eate pas garde, on a vite fait de remplir son disque dur de traces totalement inutile. Pour \u00e9viter ce probl\u00e8me, l&rsquo;id\u00e9al serait de pouvoir ajouter un \u00abtimeout\u00bb \u00e0 l&rsquo;appel de la coroutine susceptible de &hellip; <a href=\"http:\/\/www.fabienm.eu\/flf\/un-timeout-dans-cocotb\/\" class=\"more-link\">Continuer la lecture de <span class=\"screen-reader-text\">Un timeout dans cocotb<\/span> <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_uag_custom_page_level_css":"","footnotes":""},"categories":[1],"tags":[55,56,28,232],"class_list":["post-2268","post","type-post","status-publish","format-standard","hentry","category-non-classe","tag-cocotb","tag-python","tag-simulation","tag-timeout"],"uagb_featured_image_src":{"full":false,"thumbnail":false,"medium":false,"medium_large":false,"large":false,"1536x1536":false,"2048x2048":false,"post-thumbnail":false},"uagb_author_info":{"display_name":"Fabien Marteau","author_link":"http:\/\/www.fabienm.eu\/flf\/author\/admin\/"},"uagb_comment_info":0,"uagb_excerpt":"Avec Cocotb nous avons parfois des coroutines qui sont susceptible de rester \u00abcoinc\u00e9es\u00bb dans une boucle d&rsquo;attente infinie. Si l&rsquo;on y pr\u00eate pas garde, on a vite fait de remplir son disque dur de traces totalement inutile. Pour \u00e9viter ce probl\u00e8me, l&rsquo;id\u00e9al serait de pouvoir ajouter un \u00abtimeout\u00bb \u00e0 l&rsquo;appel de la coroutine susceptible de\u2026","_links":{"self":[{"href":"http:\/\/www.fabienm.eu\/flf\/wp-json\/wp\/v2\/posts\/2268","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.fabienm.eu\/flf\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.fabienm.eu\/flf\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.fabienm.eu\/flf\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.fabienm.eu\/flf\/wp-json\/wp\/v2\/comments?post=2268"}],"version-history":[{"count":2,"href":"http:\/\/www.fabienm.eu\/flf\/wp-json\/wp\/v2\/posts\/2268\/revisions"}],"predecessor-version":[{"id":2271,"href":"http:\/\/www.fabienm.eu\/flf\/wp-json\/wp\/v2\/posts\/2268\/revisions\/2271"}],"wp:attachment":[{"href":"http:\/\/www.fabienm.eu\/flf\/wp-json\/wp\/v2\/media?parent=2268"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.fabienm.eu\/flf\/wp-json\/wp\/v2\/categories?post=2268"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.fabienm.eu\/flf\/wp-json\/wp\/v2\/tags?post=2268"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}