index.html 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462
  1. <!DOCTYPE html>
  2. <html lang="en" class="h-full">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width,initial-scale=1">
  6. <meta name="color-scheme" content="light dark">
  7. <meta name="turbo-cache-control" content="no-cache" data-turbo-track="reload" data-track-token="4.1.0.825921057143">
  8. <!-- See retype.com -->
  9. <meta name="generator" content="Retype 4.1.0">
  10. <!-- Primary Meta Tags -->
  11. <title>Compute Threads | Portable Python 3.x Interpreter in Modern C</title>
  12. <meta name="title" content="Compute Threads | Portable Python 3.x Interpreter in Modern C">
  13. <meta name="description" content="pocketpy organizes its state by VM structure. Users can have at maximum 16 VM instances (index from 0 to 15). Each VM instance can only be accessed by">
  14. <!-- Canonical -->
  15. <link rel="canonical" href="https://pocketpy.dev/features/threading/">
  16. <!-- Open Graph -->
  17. <meta property="og:type" content="website">
  18. <meta property="og:url" content="https://pocketpy.dev/features/threading/">
  19. <meta property="og:title" content="Compute Threads | Portable Python 3.x Interpreter in Modern C">
  20. <meta property="og:description" content="pocketpy organizes its state by VM structure. Users can have at maximum 16 VM instances (index from 0 to 15). Each VM instance can only be accessed by">
  21. <meta property="og:site_name" content="pocketpy">
  22. <meta property="og:locale" content="en_US">
  23. <script data-cfasync="false">(function(){var cl=document.documentElement.classList,ls=localStorage.getItem("retype_scheme"),hd=cl.contains("dark"),hl=cl.contains("light"),wm=window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches;if(ls==="dark"||(!ls&&wm&&!hd&&!hl)){cl.remove("light");cl.add("dark")}else if(ls==="light"||(!ls&&!wm&&!hd&&!hl)){cl.remove("dark");cl.add("light")}})();</script>
  24. <link id="retype-favicon" rel="icon" href="../../static/logo.png" />
  25. <link href="../../resources/css/retype.css?v=4.1.0.825921057143" rel="stylesheet">
  26. <script data-cfasync="false" src="../../resources/js/config.js?v=4.1.0.825921057143" data-turbo-eval="false" defer></script>
  27. <script data-cfasync="false" src="../../resources/js/retype.js?v=4.1.0" data-turbo-eval="false" defer></script>
  28. <script id="lunr-js" data-cfasync="false" src="../../resources/js/lunr.js?v=4.1.0.825921057143" data-turbo-eval="false" defer></script>
  29. <script id="prism-js" data-cfasync="false" src="../../resources/js/prism.js?v=4.1.0.825921057143" defer></script>
  30. <script id="mermaid-js" data-cfasync="false" src="../../resources/js/mermaid.js?v=4.1.0" defer></script>
  31. </head>
  32. <body>
  33. <div id="retype-app" class="relative text-base antialiased text-base-text bg-base-bg font-body">
  34. <div class="absolute bottom-0 left-0" style="top: 5rem; right: 50%"></div>
  35. <header id="retype-header" class="sticky top-0 z-30 flex w-full h-16 bg-header-bg border-b border-header-border md:h-20">
  36. <div class="container relative flex items-center justify-between pr-6 grow md:justify-start">
  37. <!-- Mobile menu button skeleton -->
  38. <button v-cloak class="skeleton retype-mobile-menu-button flex items-center justify-center shrink-0 overflow-hidden dark:text-white focus:outline-hidden rounded-full w-10 h-10 ml-3.5 md:hidden"><svg xmlns="http://www.w3.org/2000/svg" class="mb-px shrink-0" width="24" height="24" viewBox="0 0 24 24" role="presentation" style="margin-bottom: 0px;"><g fill="currentColor"><path d="M2 4h20v2H2zM2 11h20v2H2zM2 18h20v2H2z"></path></g></svg></button>
  39. <div v-cloak id="retype-sidebar-left-toggle-button"></div>
  40. <!-- Logo -->
  41. <div class="flex items-center justify-between h-full py-2 md:w-75">
  42. <div class="flex items-center px-2 md:px-6">
  43. <a id="retype-branding-logo" href="../../" class="flex items-center leading-snug text-2xl">
  44. <span class="w-10 mr-2 grow-0 shrink-0 overflow-hidden">
  45. <img class="max-h-10 dark:hidden md:inline-block" src="../../static/logo.png">
  46. <img class="max-h-10 hidden dark:inline-block" src="../../static/logo.png">
  47. </span>
  48. <span class="dark:text-white font-bold line-clamp-1 md:line-clamp-2">pocketpy</span>
  49. </a><span id="retype-branding-label" class="inline-flex mt-1 px-2 py-1 ml-4 text-xs font-medium leading-none items-center rounded-md bg-branding-label-bg text-branding-label-text ring-1 ring-branding-label-border ring-inset md:inline-block">v2.1.8</span>
  50. </div>
  51. <span class="hidden h-8 border-r md:inline-block border-base-border"></span>
  52. </div>
  53. <div class="flex justify-between md:grow">
  54. <!-- Top Nav -->
  55. <nav id="retype-header-nav" class="hidden md:flex">
  56. <ul class="flex flex-col mb-4 md:pl-16 md:mb-0 md:flex-row md:items-center">
  57. <li class="mr-6">
  58. <a class="py-2 md:mb-0 inline-flex items-center text-sm whitespace-nowrap transition-colors duration-200 ease-linear md:text-header-text font-header-text hover:text-header-text-hover" href="">
  59. <svg xmlns="http://www.w3.org/2000/svg" class="mb-px mr-1" width="18" height="18" viewBox="0 0 24 24" role="presentation">
  60. <g fill="currentColor">
  61. <path d="M11.03 2.59a1.501 1.501 0 0 1 1.94 0l7.5 6.363a1.5 1.5 0 0 1 .53 1.144V19.5a1.5 1.5 0 0 1-1.5 1.5h-5.75a.75.75 0 0 1-.75-.75V14h-2v6.25a.75.75 0 0 1-.75.75H4.5A1.5 1.5 0 0 1 3 19.5v-9.403c0-.44.194-.859.53-1.144ZM12 3.734l-7.5 6.363V19.5h5v-6.25a.75.75 0 0 1 .75-.75h3.5a.75.75 0 0 1 .75.75v6.25h5v-9.403Z"/>
  62. </g>
  63. </svg>
  64. <span>Home</span>
  65. </a>
  66. </li>
  67. <li class="mr-6">
  68. <a class="py-2 md:mb-0 inline-flex items-center text-sm whitespace-nowrap transition-colors duration-200 ease-linear md:text-header-text font-header-text hover:text-header-text-hover" href="https://pocketpy.dev/static/web/" target="_blank">
  69. <svg xmlns="http://www.w3.org/2000/svg" class="mb-px mr-1" width="18" height="18" viewBox="0 0 24 24" role="presentation">
  70. <g fill="currentColor">
  71. <path d="M9.5 15.584V8.416a.5.5 0 0 1 .77-.42l5.576 3.583a.5.5 0 0 1 0 .842l-5.576 3.584a.5.5 0 0 1-.77-.42Z"/><path d="M1 12C1 5.925 5.925 1 12 1s11 4.925 11 11-4.925 11-11 11S1 18.075 1 12Zm11-9.5A9.5 9.5 0 0 0 2.5 12a9.5 9.5 0 0 0 9.5 9.5 9.5 9.5 0 0 0 9.5-9.5A9.5 9.5 0 0 0 12 2.5Z"/>
  72. </g>
  73. </svg>
  74. <span>Live Demo</span>
  75. </a>
  76. </li>
  77. <li class="mr-6">
  78. <a class="py-2 md:mb-0 inline-flex items-center text-sm whitespace-nowrap transition-colors duration-200 ease-linear md:text-header-text font-header-text hover:text-header-text-hover" href="https://pocketpy.github.io/examples/" target="_blank">
  79. <svg xmlns="http://www.w3.org/2000/svg" class="mb-px mr-1" width="18" height="18" viewBox="0 0 24 24" role="presentation">
  80. <g fill="currentColor">
  81. <path d="M15.22 4.97a.75.75 0 0 1 1.06 0l6.5 6.5a.75.75 0 0 1 0 1.06l-6.5 6.5a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734L21.19 12l-5.97-5.97a.75.75 0 0 1 0-1.06Zm-6.44 0a.75.75 0 0 1 0 1.06L2.81 12l5.97 5.97a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215l-6.5-6.5a.75.75 0 0 1 0-1.06l6.5-6.5a.75.75 0 0 1 1.06 0Z"/>
  82. </g>
  83. </svg>
  84. <span>Live Examples</span>
  85. </a>
  86. </li>
  87. <li class="mr-6">
  88. <a class="py-2 md:mb-0 inline-flex items-center text-sm whitespace-nowrap transition-colors duration-200 ease-linear md:text-header-text font-header-text hover:text-header-text-hover" href="https://github.com/blueloveth/pocketpy" target="_blank">
  89. <svg xmlns="http://www.w3.org/2000/svg" class="mb-px mr-1" width="18" height="18" viewBox="0 0 24 24" role="presentation">
  90. <g fill="currentColor">
  91. <path d="M10.303 16.652c-2.837-.344-4.835-2.385-4.835-5.028 0-1.074.387-2.235 1.031-3.008-.279-.709-.236-2.214.086-2.837.86-.107 2.02.344 2.708.967.816-.258 1.676-.386 2.728-.386 1.053 0 1.913.128 2.686.365.666-.602 1.848-1.053 2.708-.946.3.581.344 2.085.064 2.815.688.817 1.053 1.913 1.053 3.03 0 2.643-1.998 4.641-4.877 5.006.73.473 1.224 1.504 1.224 2.686v2.235c0 .644.537 1.01 1.182.752 3.889-1.483 6.94-5.372 6.94-10.185 0-6.081-4.942-11.044-11.022-11.044-6.081 0-10.98 4.963-10.98 11.044a10.84 10.84 0 0 0 7.112 10.206c.58.215 1.139-.172 1.139-.752v-1.719a2.768 2.768 0 0 1-1.032.215c-1.418 0-2.256-.773-2.857-2.213-.237-.58-.495-.924-.989-.988-.258-.022-.344-.129-.344-.258 0-.258.43-.451.86-.451.623 0 1.16.386 1.719 1.181.43.623.881.903 1.418.903.537 0 .881-.194 1.375-.688.365-.365.645-.687.903-.902Z"/>
  92. </g>
  93. </svg>
  94. <span>Github</span>
  95. </a>
  96. </li>
  97. <li class="mr-6">
  98. <a class="py-2 md:mb-0 inline-flex items-center text-sm whitespace-nowrap transition-colors duration-200 ease-linear md:text-header-text font-header-text hover:text-header-text-hover" href="https://discord.gg/WWaq72GzXv" target="_blank">
  99. <svg xmlns="http://www.w3.org/2000/svg" class="mb-px mr-1" width="18" height="18" viewBox="0 0 24 24" role="presentation">
  100. <g fill="currentColor">
  101. <path d="M1.75 1h12.5c.966 0 1.75.784 1.75 1.75v9.5A1.75 1.75 0 0 1 14.25 14H8.061l-2.574 2.573A1.458 1.458 0 0 1 3 15.543V14H1.75A1.75 1.75 0 0 1 0 12.25v-9.5C0 1.784.784 1 1.75 1ZM1.5 2.75v9.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h6.5a.25.25 0 0 0 .25-.25v-9.5a.25.25 0 0 0-.25-.25H1.75a.25.25 0 0 0-.25.25Z"/><path d="M22.5 8.75a.25.25 0 0 0-.25-.25h-3.5a.75.75 0 0 1 0-1.5h3.5c.966 0 1.75.784 1.75 1.75v9.5A1.75 1.75 0 0 1 22.25 20H21v1.543a1.457 1.457 0 0 1-2.487 1.03L15.939 20H10.75A1.75 1.75 0 0 1 9 18.25v-1.465a.75.75 0 0 1 1.5 0v1.465c0 .138.112.25.25.25h5.5a.75.75 0 0 1 .53.22l2.72 2.72v-2.19a.75.75 0 0 1 .75-.75h2a.25.25 0 0 0 .25-.25v-9.5Z"/>
  102. </g>
  103. </svg>
  104. <span>Discord</span>
  105. </a>
  106. </li>
  107. </ul>
  108. </nav>
  109. <div v-cloak class="flex justify-end grow">
  110. <div id="retype-mobile-search-button"></div>
  111. <doc-search-desktop></doc-search-desktop>
  112. <doc-theme-switch class="lg:ml-2"></doc-theme-switch>
  113. <doc-history></doc-history>
  114. </div>
  115. </div>
  116. </div>
  117. </header>
  118. <div id="retype-container" class="container relative flex bg-white">
  119. <!-- Sidebar Skeleton -->
  120. <div v-cloak class="fixed flex flex-col shrink-0 duration-300 ease-in-out bg-sidebar-left-bg border-sidebar-left-border sidebar top-20 w-75 border-r h-screen md:sticky transition-transform skeleton">
  121. <div class="flex items-center h-16 px-6">
  122. <input id="retype-filter-input-mock" class="w-full h-10 pl-8 px-3 py-2 transition-colors duration-200 ease-linear bg-filter-bg border border-filter-border rounded-lg shadow-none md:text-sm hover:border-filter-border-hover focus:outline-hidden focus:border-filter-border-focus placeholder-filter-placeholder" type="text">
  123. </div>
  124. <div class="pl-6 mt-1 mb-4">
  125. <div class="w-32 h-3 mb-4 bg-skeleton-bg rounded-full loading"></div>
  126. <div class="w-48 h-3 mb-4 bg-skeleton-bg rounded-full loading"></div>
  127. <div class="w-40 h-3 mb-4 bg-skeleton-bg rounded-full loading"></div>
  128. <div class="w-32 h-3 mb-4 bg-skeleton-bg rounded-full loading"></div>
  129. <div class="w-48 h-3 mb-4 bg-skeleton-bg rounded-full loading"></div>
  130. <div class="w-40 h-3 mb-4 bg-skeleton-bg rounded-full loading"></div>
  131. </div>
  132. <div class="shrink-0 mt-auto bg-transparent dark:border-base-border">
  133. <a class="flex items-center justify-center flex-nowrap h-16 text-gray-350 dark:text-dark-400 hover:text-gray-600 dark:hover:text-dark-300 transition-colors duration-150 ease-in docs-powered-by" target="_blank" href="https://retype.com/" rel="noopener">
  134. <span class="text-xs whitespace-nowrap">Powered by</span>
  135. <svg xmlns="http://www.w3.org/2000/svg" class="ml-2" fill="currentColor" width="96" height="20" overflow="visible"><path d="M0 0v20h13.59V0H0zm11.15 17.54H2.44V2.46h8.71v15.08zM15.8 20h2.44V4.67L15.8 2.22zM20.45 6.89V20h2.44V9.34z"/><g><path d="M40.16 8.44c0 1.49-.59 2.45-1.75 2.88l2.34 3.32h-2.53l-2.04-2.96h-1.43v2.96h-2.06V5.36h3.5c1.43 0 2.46.24 3.07.73s.9 1.27.9 2.35zm-2.48 1.1c.26-.23.38-.59.38-1.09 0-.5-.13-.84-.4-1.03s-.73-.28-1.39-.28h-1.54v2.75h1.5c.72 0 1.2-.12 1.45-.35zM51.56 5.36V7.2h-4.59v1.91h4.13v1.76h-4.13v1.92h4.74v1.83h-6.79V5.36h6.64zM60.09 7.15v7.48h-2.06V7.15h-2.61V5.36h7.28v1.79h-2.61zM70.81 14.64h-2.06v-3.66l-3.19-5.61h2.23l1.99 3.45 1.99-3.45H74l-3.19 5.61v3.66zM83.99 6.19c.65.55.97 1.4.97 2.55s-.33 1.98-1 2.51-1.68.8-3.04.8h-1.23v2.59h-2.06V5.36h3.26c1.42 0 2.45.28 3.1.83zm-1.51 3.65c.25-.28.37-.69.37-1.22s-.16-.92-.48-1.14c-.32-.23-.82-.34-1.5-.34H79.7v3.12h1.38c.68 0 1.15-.14 1.4-.42zM95.85 5.36V7.2h-4.59v1.91h4.13v1.76h-4.13v1.92H96v1.83h-6.79V5.36h6.64z"/></g></svg>
  136. </a>
  137. </div>
  138. </div>
  139. <!-- Sidebar component -->
  140. <doc-sidebar v-cloak>
  141. <template #sidebar-footer>
  142. <div class="shrink-0 mt-auto border-t md:bg-transparent md:border-none dark:border-base-border">
  143. <div class="py-3 px-6 md:hidden border-b dark:border-base-border">
  144. <nav>
  145. <ul class="flex flex-wrap justify-center items-center">
  146. <li class="mr-6">
  147. <a class="block py-1 inline-flex items-center text-sm whitespace-nowrap transition-colors duration-200 ease-linear md:text-header-text font-header-text hover:text-header-text-hover" href="">
  148. <svg xmlns="http://www.w3.org/2000/svg" class="mb-px mr-1" width="18" height="18" viewBox="0 0 24 24" role="presentation">
  149. <g fill="currentColor">
  150. <path d="M11.03 2.59a1.501 1.501 0 0 1 1.94 0l7.5 6.363a1.5 1.5 0 0 1 .53 1.144V19.5a1.5 1.5 0 0 1-1.5 1.5h-5.75a.75.75 0 0 1-.75-.75V14h-2v6.25a.75.75 0 0 1-.75.75H4.5A1.5 1.5 0 0 1 3 19.5v-9.403c0-.44.194-.859.53-1.144ZM12 3.734l-7.5 6.363V19.5h5v-6.25a.75.75 0 0 1 .75-.75h3.5a.75.75 0 0 1 .75.75v6.25h5v-9.403Z"/>
  151. </g>
  152. </svg>
  153. <span>Home</span>
  154. </a>
  155. </li>
  156. <li class="mr-6">
  157. <a class="block py-1 inline-flex items-center text-sm whitespace-nowrap transition-colors duration-200 ease-linear md:text-header-text font-header-text hover:text-header-text-hover" href="https://pocketpy.dev/static/web/" target="_blank">
  158. <svg xmlns="http://www.w3.org/2000/svg" class="mb-px mr-1" width="18" height="18" viewBox="0 0 24 24" role="presentation">
  159. <g fill="currentColor">
  160. <path d="M9.5 15.584V8.416a.5.5 0 0 1 .77-.42l5.576 3.583a.5.5 0 0 1 0 .842l-5.576 3.584a.5.5 0 0 1-.77-.42Z"/><path d="M1 12C1 5.925 5.925 1 12 1s11 4.925 11 11-4.925 11-11 11S1 18.075 1 12Zm11-9.5A9.5 9.5 0 0 0 2.5 12a9.5 9.5 0 0 0 9.5 9.5 9.5 9.5 0 0 0 9.5-9.5A9.5 9.5 0 0 0 12 2.5Z"/>
  161. </g>
  162. </svg>
  163. <span>Live Demo</span>
  164. </a>
  165. </li>
  166. <li class="mr-6">
  167. <a class="block py-1 inline-flex items-center text-sm whitespace-nowrap transition-colors duration-200 ease-linear md:text-header-text font-header-text hover:text-header-text-hover" href="https://pocketpy.github.io/examples/" target="_blank">
  168. <svg xmlns="http://www.w3.org/2000/svg" class="mb-px mr-1" width="18" height="18" viewBox="0 0 24 24" role="presentation">
  169. <g fill="currentColor">
  170. <path d="M15.22 4.97a.75.75 0 0 1 1.06 0l6.5 6.5a.75.75 0 0 1 0 1.06l-6.5 6.5a.749.749 0 0 1-1.275-.326.749.749 0 0 1 .215-.734L21.19 12l-5.97-5.97a.75.75 0 0 1 0-1.06Zm-6.44 0a.75.75 0 0 1 0 1.06L2.81 12l5.97 5.97a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215l-6.5-6.5a.75.75 0 0 1 0-1.06l6.5-6.5a.75.75 0 0 1 1.06 0Z"/>
  171. </g>
  172. </svg>
  173. <span>Live Examples</span>
  174. </a>
  175. </li>
  176. <li class="mr-6">
  177. <a class="block py-1 inline-flex items-center text-sm whitespace-nowrap transition-colors duration-200 ease-linear md:text-header-text font-header-text hover:text-header-text-hover" href="https://github.com/blueloveth/pocketpy" target="_blank">
  178. <svg xmlns="http://www.w3.org/2000/svg" class="mb-px mr-1" width="18" height="18" viewBox="0 0 24 24" role="presentation">
  179. <g fill="currentColor">
  180. <path d="M10.303 16.652c-2.837-.344-4.835-2.385-4.835-5.028 0-1.074.387-2.235 1.031-3.008-.279-.709-.236-2.214.086-2.837.86-.107 2.02.344 2.708.967.816-.258 1.676-.386 2.728-.386 1.053 0 1.913.128 2.686.365.666-.602 1.848-1.053 2.708-.946.3.581.344 2.085.064 2.815.688.817 1.053 1.913 1.053 3.03 0 2.643-1.998 4.641-4.877 5.006.73.473 1.224 1.504 1.224 2.686v2.235c0 .644.537 1.01 1.182.752 3.889-1.483 6.94-5.372 6.94-10.185 0-6.081-4.942-11.044-11.022-11.044-6.081 0-10.98 4.963-10.98 11.044a10.84 10.84 0 0 0 7.112 10.206c.58.215 1.139-.172 1.139-.752v-1.719a2.768 2.768 0 0 1-1.032.215c-1.418 0-2.256-.773-2.857-2.213-.237-.58-.495-.924-.989-.988-.258-.022-.344-.129-.344-.258 0-.258.43-.451.86-.451.623 0 1.16.386 1.719 1.181.43.623.881.903 1.418.903.537 0 .881-.194 1.375-.688.365-.365.645-.687.903-.902Z"/>
  181. </g>
  182. </svg>
  183. <span>Github</span>
  184. </a>
  185. </li>
  186. <li class="mr-6">
  187. <a class="block py-1 inline-flex items-center text-sm whitespace-nowrap transition-colors duration-200 ease-linear md:text-header-text font-header-text hover:text-header-text-hover" href="https://discord.gg/WWaq72GzXv" target="_blank">
  188. <svg xmlns="http://www.w3.org/2000/svg" class="mb-px mr-1" width="18" height="18" viewBox="0 0 24 24" role="presentation">
  189. <g fill="currentColor">
  190. <path d="M1.75 1h12.5c.966 0 1.75.784 1.75 1.75v9.5A1.75 1.75 0 0 1 14.25 14H8.061l-2.574 2.573A1.458 1.458 0 0 1 3 15.543V14H1.75A1.75 1.75 0 0 1 0 12.25v-9.5C0 1.784.784 1 1.75 1ZM1.5 2.75v9.5c0 .138.112.25.25.25h2a.75.75 0 0 1 .75.75v2.19l2.72-2.72a.749.749 0 0 1 .53-.22h6.5a.25.25 0 0 0 .25-.25v-9.5a.25.25 0 0 0-.25-.25H1.75a.25.25 0 0 0-.25.25Z"/><path d="M22.5 8.75a.25.25 0 0 0-.25-.25h-3.5a.75.75 0 0 1 0-1.5h3.5c.966 0 1.75.784 1.75 1.75v9.5A1.75 1.75 0 0 1 22.25 20H21v1.543a1.457 1.457 0 0 1-2.487 1.03L15.939 20H10.75A1.75 1.75 0 0 1 9 18.25v-1.465a.75.75 0 0 1 1.5 0v1.465c0 .138.112.25.25.25h5.5a.75.75 0 0 1 .53.22l2.72 2.72v-2.19a.75.75 0 0 1 .75-.75h2a.25.25 0 0 0 .25-.25v-9.5Z"/>
  191. </g>
  192. </svg>
  193. <span>Discord</span>
  194. </a>
  195. </li>
  196. </ul>
  197. </nav>
  198. </div>
  199. <a class="flex items-center justify-center flex-nowrap h-16 text-gray-350 dark:text-dark-400 hover:text-gray-600 dark:hover:text-dark-300 transition-colors duration-150 ease-in docs-powered-by" target="_blank" href="https://retype.com/" rel="noopener">
  200. <span class="text-xs whitespace-nowrap">Powered by</span>
  201. <svg xmlns="http://www.w3.org/2000/svg" class="ml-2" fill="currentColor" width="96" height="20" overflow="visible"><path d="M0 0v20h13.59V0H0zm11.15 17.54H2.44V2.46h8.71v15.08zM15.8 20h2.44V4.67L15.8 2.22zM20.45 6.89V20h2.44V9.34z"/><g><path d="M40.16 8.44c0 1.49-.59 2.45-1.75 2.88l2.34 3.32h-2.53l-2.04-2.96h-1.43v2.96h-2.06V5.36h3.5c1.43 0 2.46.24 3.07.73s.9 1.27.9 2.35zm-2.48 1.1c.26-.23.38-.59.38-1.09 0-.5-.13-.84-.4-1.03s-.73-.28-1.39-.28h-1.54v2.75h1.5c.72 0 1.2-.12 1.45-.35zM51.56 5.36V7.2h-4.59v1.91h4.13v1.76h-4.13v1.92h4.74v1.83h-6.79V5.36h6.64zM60.09 7.15v7.48h-2.06V7.15h-2.61V5.36h7.28v1.79h-2.61zM70.81 14.64h-2.06v-3.66l-3.19-5.61h2.23l1.99 3.45 1.99-3.45H74l-3.19 5.61v3.66zM83.99 6.19c.65.55.97 1.4.97 2.55s-.33 1.98-1 2.51-1.68.8-3.04.8h-1.23v2.59h-2.06V5.36h3.26c1.42 0 2.45.28 3.1.83zm-1.51 3.65c.25-.28.37-.69.37-1.22s-.16-.92-.48-1.14c-.32-.23-.82-.34-1.5-.34H79.7v3.12h1.38c.68 0 1.15-.14 1.4-.42zM95.85 5.36V7.2h-4.59v1.91h4.13v1.76h-4.13v1.92H96v1.83h-6.79V5.36h6.64z"/></g></svg>
  202. </a>
  203. </div>
  204. </template>
  205. </doc-sidebar>
  206. <div class="grow min-w-0 bg-body-bg">
  207. <!-- Render "toolbar" template here on api pages --><!-- Render page content -->
  208. <div class="flex">
  209. <div id="retype-main" class="min-w-0 p-4 grow md:px-16">
  210. <main class="relative pb-12 lg:pt-2">
  211. <div class="retype-markdown" id="retype-content">
  212. <!-- Rendered if sidebar right is enabled -->
  213. <div id="retype-sidebar-right-toggle"></div>
  214. <!-- Page content -->
  215. <doc-anchor-target id="compute-threads" class="break-words">
  216. <h1>
  217. <doc-anchor-trigger class="header-anchor-trigger" to="#compute-threads">#</doc-anchor-trigger>
  218. <span>Compute Threads</span>
  219. </h1>
  220. </doc-anchor-target>
  221. <p>pocketpy organizes its state by <code translate="no" v-pre>VM</code> structure.
  222. Users can have at maximum 16 <code translate="no" v-pre>VM</code> instances (index from 0 to 15).
  223. Each <code translate="no" v-pre>VM</code> instance can only be accessed by exactly one thread at a time.
  224. If you are trying to run two python scripts in parallel refering the same <code translate="no" v-pre>VM</code> instance,
  225. you will crash it definitely.</p>
  226. <p>However, there are two ways to achieve multi-threading in pocketpy.</p>
  227. <p>One way is to use a native threading library such as <code translate="no" v-pre>pthread</code>.
  228. You can wrap the multi-threading logic into a C function and bind it to pocketpy.
  229. Be careful and not to access the same <code translate="no" v-pre>VM</code> instance from multiple threads at the same time.
  230. You need to lock critical resources or perform a deep copy of all needed data.</p>
  231. <doc-anchor-target id="computethread">
  232. <h2>
  233. <doc-anchor-trigger class="header-anchor-trigger" to="#computethread">#</doc-anchor-trigger>
  234. <span>ComputeThread</span>
  235. </h2>
  236. </doc-anchor-target>
  237. <p>The other way is to use <code translate="no" v-pre>pkpy.ComputeThread</code>.
  238. It is like an isolate in Dart language.
  239. <code translate="no" v-pre>ComputeThread</code> is a true multi-threading model to allow you run python scripts in parallel without lock,
  240. backed by a separate <code translate="no" v-pre>VM</code> instance.</p>
  241. <p><code translate="no" v-pre>ComputeThread</code> is highly designed for computational intensive tasks in games.
  242. For example, you can run game logic in main thread (VM 0) and run world generation in another thread (e.g. VM 1).</p>
  243. <div class="overflow-hidden mb-6 py-4 dark:px-5 dark:bg-white rounded-md"><pre translate="no" class="mermaid w-full">graph TD
  244. subgraph Main Thread
  245. A[Game Start]
  246. B[Submit WorldGen Job]
  247. C[Frame 1]
  248. D[Frame 2]
  249. E[Frame 3]
  250. F[...]
  251. G[Get WorldGen Result]
  252. H[Render World]
  253. end
  254. subgraph WorldGen Thread
  255. O[Generate Biomes]
  256. P[Generate Terrain]
  257. Q[Generate Creatures]
  258. R[Dump Result]
  259. end
  260. A --&gt; B
  261. B --&gt; C
  262. C --&gt; D
  263. D --&gt; E
  264. E --&gt; F
  265. F --&gt; G
  266. G --&gt; H
  267. O --&gt; P
  268. P --&gt; Q
  269. Q --&gt; R
  270. B --&gt; O
  271. R --&gt; G</pre></div>
  272. <doc-anchor-target id="mainpy">
  273. <h4>
  274. <doc-anchor-trigger class="header-anchor-trigger" to="#mainpy">#</doc-anchor-trigger>
  275. <span><code translate="no" v-pre>main.py</code></span>
  276. </h4>
  277. </doc-anchor-target>
  278. <div id="mainpy-code-1" class="codeblock-wrapper"><doc-codeblock>
  279. <pre translate="no" class="language-python"><code v-pre class="language-python">import time
  280. from pkpy import ComputeThread
  281. thread = ComputeThread(1)
  282. print(&quot;Game Start&quot;)
  283. # import worldgen.py
  284. thread.exec('from worldgen import gen_world')
  285. print(&quot;Submit WorldGen Job&quot;)
  286. thread.submit_call('gen_world', 3, (100, 100), 10)
  287. # wait for worldgen to finish
  288. for i in range(1, 100000):
  289. print('Frame:', i)
  290. time.sleep(1)
  291. if thread.is_done:
  292. break
  293. error = thread.last_error()
  294. if error is not None:
  295. print(&quot;Error:&quot;, error)
  296. else:
  297. retval = thread.last_retval()
  298. biomes = retval['biomes']
  299. terrain = retval['terrain']
  300. creatures = retval['creatures']
  301. print(&quot;World Generation Complete&quot;, len(biomes), len(terrain), len(creatures))</code></pre>
  302. </doc-codeblock></div>
  303. <doc-anchor-target id="worldgenpy">
  304. <h4>
  305. <doc-anchor-trigger class="header-anchor-trigger" to="#worldgenpy">#</doc-anchor-trigger>
  306. <span><code translate="no" v-pre>worldgen.py</code></span>
  307. </h4>
  308. </doc-anchor-target>
  309. <div id="worldgenpy-code-1" class="codeblock-wrapper"><doc-codeblock>
  310. <pre translate="no" class="language-python"><code v-pre class="language-python">import time
  311. import random
  312. def gen_world(biome_count: int, terrain_size: tuple[int, int], creature_count: int) -&gt; dict:
  313. # simulate a long computation
  314. time.sleep(3)
  315. # generate world data
  316. all_biomes = [&quot;forest&quot;, &quot;desert&quot;, &quot;ocean&quot;, &quot;mountain&quot;, &quot;swamp&quot;]
  317. all_creatures = [&quot;wolf&quot;, &quot;bear&quot;, &quot;fish&quot;, &quot;bird&quot;, &quot;lizard&quot;]
  318. width, height = terrain_size
  319. terrain_data = [
  320. random.randint(1, 10)
  321. for _ in range(width * height)
  322. ]
  323. creatures = [
  324. {
  325. &quot;name&quot;: random.choice(all_creatures),
  326. &quot;x&quot;: random.randint(0, width - 1),
  327. &quot;y&quot;: random.randint(0, height - 1),
  328. }
  329. for i in range(creature_count)
  330. ]
  331. return {
  332. &quot;biomes&quot;: all_biomes[:biome_count],
  333. &quot;terrain&quot;: terrain_data,
  334. &quot;creatures&quot;: creatures,
  335. }</code></pre>
  336. </doc-codeblock></div>
  337. <p>Run <code translate="no" v-pre>main.py</code> and you will see the result like this:</p>
  338. <div id="worldgenpy-code-2" class="codeblock-wrapper"><doc-codeblock>
  339. <pre translate="no" class="language-none"><code v-pre class="language-none">Game Start
  340. Submit WorldGen Job
  341. Frame: 1
  342. Frame: 2
  343. Frame: 3
  344. Frame: 4
  345. World Generation Complete 3 10000 10</code></pre>
  346. </doc-codeblock></div>
  347. <p><code translate="no" v-pre>ComputeThread</code> uses <code translate="no" v-pre>pickle</code> module to serialize the data between threads.
  348. Parameters and return values must be supported by <code translate="no" v-pre>pickle</code>.
  349. See <a href="https://pocketpy.dev/modules/pickle/">pickle</a> for more details.</p>
  350. <p>Since <code translate="no" v-pre>ComputeThread</code> is backed by a separate <code translate="no" v-pre>VM</code> instance,
  351. it does not share any state with the main thread
  352. except for the parameters you pass to it.
  353. Therefore, common python modules will be imported twice in each thread.</p>
  354. <p>If you want to identify which VM instance the module is running in,
  355. you can call <code translate="no" v-pre>pkpy.currentvm</code> or let your <code translate="no" v-pre>ComputeThread</code> set some special flags
  356. before importing these modules.</p>
  357. <!-- Required only on API pages -->
  358. <doc-toolbar-member-filter-no-results></doc-toolbar-member-filter-no-results>
  359. </div>
  360. <footer id="retype-content-footer" class="clear-both">
  361. <nav id="retype-nextprev" class="print:hidden flex mt-14">
  362. <div class="w-1/2">
  363. <a class="px-5 py-4 h-full flex items-center break-normal font-medium text-body-link border border-base-border hover:border-base-border-hover rounded-l-lg transition-colors duration-150 relative hover:z-5" href="../../features/profiling/">
  364. <svg xmlns="http://www.w3.org/2000/svg" class="mr-3" width="24" height="24" viewBox="0 0 24 24" fill="currentColor" overflow="visible"><path d="M19 11H7.41l5.29-5.29a.996.996 0 10-1.41-1.41l-7 7a1 1 0 000 1.42l7 7a1.024 1.024 0 001.42-.01.996.996 0 000-1.41L7.41 13H19c.55 0 1-.45 1-1s-.45-1-1-1z" /><path fill="none" d="M0 0h24v24H0z" /></svg>
  365. <span>
  366. <span class="block text-xs font-normal text-base-text-muted">Previous</span>
  367. <span class="block mt-1">Profiling</span>
  368. </span>
  369. </a>
  370. </div>
  371. <div class="w-1/2">
  372. <a class="px-5 py-4 -mx-px h-full flex items-center justify-end break-normal font-medium text-body-link border border-base-border hover:border-base-border-hover rounded-r-lg transition-colors duration-150 relative hover:z-5" href="../../features/ub/">
  373. <span>
  374. <span class="block text-xs font-normal text-right text-base-text-muted">Next</span>
  375. <span class="block mt-1">Undefined Behaviour</span>
  376. </span>
  377. <svg xmlns="http://www.w3.org/2000/svg" class="ml-3" width="24" height="24" viewBox="0 0 24 24" fill="currentColor" overflow="visible"><path d="M19.92 12.38a1 1 0 00-.22-1.09l-7-7a.996.996 0 10-1.41 1.41l5.3 5.3H5c-.55 0-1 .45-1 1s.45 1 1 1h11.59l-5.29 5.29a.996.996 0 000 1.41c.19.2.44.3.7.3s.51-.1.71-.29l7-7c.09-.09.16-.21.21-.33z" /><path fill="none" d="M0 0h24v24H0z" /></svg>
  378. </a>
  379. </div>
  380. </nav>
  381. </footer>
  382. </main>
  383. <div id="retype-page-footer" class="print:border-none border-t border-base-border pt-6 mb-8">
  384. <footer class="flex flex-wrap items-center justify-between print:justify-center">
  385. <div id="retype-footer-links" class="print:hidden">
  386. <ul class="flex flex-wrap items-center text-sm">
  387. </ul>
  388. </div>
  389. <div id="retype-copyright" class="print:justify-center py-2 text-footer-text font-footer-link text-sm leading-relaxed"><p>© Copyright 2026 - <a href="https://github.com/blueloveTH">blueloveTH</a> - All rights reserved.</p></div>
  390. </footer>
  391. </div>
  392. </div>
  393. <!-- Rendered if sidebar right is enabled -->
  394. <!-- Sidebar right skeleton-->
  395. <div v-cloak class="fixed top-0 bottom-0 right-0 translate-x-full bg-sidebar-right-bg border-sidebar-right-border lg:sticky lg:border-l lg:shrink-0 lg:pt-6 lg:translate-x-0 sm:w-1/2 lg:w-64 lg:z-0 md:w-104 sidebar-right skeleton">
  396. <div class="pl-5">
  397. <div class="w-32 h-3 mb-4 bg-skeleton-bg rounded-full loading"></div>
  398. <div class="w-48 h-3 mb-4 bg-skeleton-bg rounded-full loading"></div>
  399. <div class="w-40 h-3 mb-4 bg-skeleton-bg rounded-full loading"></div>
  400. </div>
  401. </div>
  402. <!-- User should be able to hide sidebar right -->
  403. <doc-sidebar-right v-cloak></doc-sidebar-right>
  404. </div>
  405. </div>
  406. </div>
  407. <doc-search-mobile></doc-search-mobile>
  408. <doc-back-to-top></doc-back-to-top>
  409. </div>
  410. <div id="retype-overlay-target"></div>
  411. <script data-cfasync="false">window.__DOCS__ = { "title": "Compute Threads", level: 2, icon: "file", hasPrism: true, hasMermaid: true, hasMath: false, tocDepth: 23 }</script>
  412. </body>
  413. </html>