index.html 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428
  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.3.0.827133044009">
  8. <!-- See retype.com -->
  9. <meta name="generator" content="Retype 4.3.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. <!-- Twitter -->
  24. <meta name="twitter:card" content="summary_large_image">
  25. <meta name="twitter:url" content="https://pocketpy.dev/features/threading/">
  26. <meta name="twitter:title" content="Compute Threads | Portable Python 3.x Interpreter in Modern C">
  27. <meta name="twitter: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">
  28. <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>
  29. <link id="retype-favicon" rel="icon" href="../../static/logo.png" />
  30. <link href="../../resources/css/retype.css?v=4.3.0.827133044009" rel="stylesheet">
  31. <script data-cfasync="false" src="../../resources/js/config.js?v=4.3.0.827133044009" data-turbo-eval="false" defer></script>
  32. <script data-cfasync="false" src="../../resources/js/retype.js?v=4.3.0" data-turbo-eval="false" defer></script>
  33. <script id="lunr-js" data-cfasync="false" src="../../resources/js/lunr.js?v=4.3.0.827133044009" data-turbo-eval="false" defer></script>
  34. <script id="prism-js" data-cfasync="false" src="../../resources/js/prism.js?v=4.3.0.827133044009" defer></script>
  35. <script id="mermaid-js" data-cfasync="false" src="../../resources/js/mermaid.js?v=4.3.0" defer></script>
  36. </head>
  37. <body>
  38. <div id="retype-app" class="relative text-base antialiased text-base-text bg-base-bg font-body">
  39. <div class="absolute bottom-0 left-0" style="top: 5rem; right: 50%"></div>
  40. <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">
  41. <div class="container relative flex items-center justify-between pr-6 grow md:justify-start">
  42. <!-- Mobile menu button skeleton -->
  43. <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>
  44. <div v-cloak id="retype-sidebar-left-toggle-button"></div>
  45. <!-- Logo -->
  46. <div class="flex items-center justify-between h-full py-2 md:w-75">
  47. <div class="flex items-center px-2 md:px-6">
  48. <a id="retype-branding-logo" href="https://pocketpy.dev/" class="flex items-center leading-snug text-2xl">
  49. <span class="w-10 mr-2 grow-0 shrink-0 overflow-hidden">
  50. <img class="max-h-10 dark:hidden md:inline-block" src="../../static/logo.png" alt="" width="512" height="512">
  51. <img class="max-h-10 hidden dark:inline-block" src="../../static/logo.png" alt="" width="512" height="512">
  52. </span>
  53. <span class="dark:text-white font-bold line-clamp-1 md:line-clamp-2">pocketpy</span>
  54. </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>
  55. </div>
  56. <span class="hidden h-8 border-r md:inline-block border-base-border"></span>
  57. </div>
  58. <div class="flex justify-between md:grow">
  59. <!-- Top Nav -->
  60. <nav id="retype-header-nav" class="hidden md:flex">
  61. <ul class="flex flex-col mb-4 md:pl-16 md:mb-0 md:flex-row md:items-center">
  62. <li class="mr-6">
  63. <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="">
  64. <svg xmlns="http://www.w3.org/2000/svg" class="mb-px mr-1.5" width="18" height="18" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" focusable="false">
  65. <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"/>
  66. </svg>
  67. <span>Home</span>
  68. </a>
  69. </li>
  70. <li class="mr-6">
  71. <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">
  72. <svg xmlns="http://www.w3.org/2000/svg" class="mb-px mr-1.5" width="18" height="18" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" focusable="false">
  73. <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"/>
  74. </svg>
  75. <span>Live Demo</span>
  76. </a>
  77. </li>
  78. <li class="mr-6">
  79. <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">
  80. <svg xmlns="http://www.w3.org/2000/svg" class="mb-px mr-1.5" width="18" height="18" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" focusable="false">
  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. </svg>
  83. <span>Live Examples</span>
  84. </a>
  85. </li>
  86. <li class="mr-6">
  87. <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">
  88. <svg xmlns="http://www.w3.org/2000/svg" class="mb-px mr-1.5" width="18" height="18" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" focusable="false">
  89. <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"/>
  90. </svg>
  91. <span>Github</span>
  92. </a>
  93. </li>
  94. <li class="mr-6">
  95. <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">
  96. <svg xmlns="http://www.w3.org/2000/svg" class="mb-px mr-1.5" width="18" height="18" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" focusable="false">
  97. <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"/>
  98. </svg>
  99. <span>Discord</span>
  100. </a>
  101. </li>
  102. </ul>
  103. </nav>
  104. <div v-cloak class="flex justify-end grow">
  105. <div id="retype-mobile-search-button"></div>
  106. <doc-search-desktop></doc-search-desktop>
  107. <doc-theme-switch class="lg:ml-2"></doc-theme-switch>
  108. <doc-history></doc-history>
  109. </div>
  110. </div>
  111. </div>
  112. </header>
  113. <div id="retype-container" class="container relative flex bg-white">
  114. <!-- Sidebar Skeleton -->
  115. <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">
  116. <div class="flex items-center h-16 px-6">
  117. <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">
  118. </div>
  119. <div class="pl-6 mt-1 mb-4">
  120. <div class="w-32 h-3 mb-4 bg-skeleton-bg rounded-full loading"></div>
  121. <div class="w-48 h-3 mb-4 bg-skeleton-bg rounded-full loading"></div>
  122. <div class="w-40 h-3 mb-4 bg-skeleton-bg rounded-full loading"></div>
  123. <div class="w-32 h-3 mb-4 bg-skeleton-bg rounded-full loading"></div>
  124. <div class="w-48 h-3 mb-4 bg-skeleton-bg rounded-full loading"></div>
  125. <div class="w-40 h-3 mb-4 bg-skeleton-bg rounded-full loading"></div>
  126. </div>
  127. <div class="shrink-0 mt-auto bg-transparent dark:border-base-border">
  128. <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">
  129. <span class="text-xs whitespace-nowrap">Powered by</span>
  130. <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>
  131. </a>
  132. </div>
  133. </div>
  134. <!-- Sidebar component -->
  135. <doc-sidebar v-cloak>
  136. <template #sidebar-footer>
  137. <div class="shrink-0 mt-auto border-t md:bg-transparent md:border-none dark:border-base-border">
  138. <div class="py-3 px-6 md:hidden border-b dark:border-base-border">
  139. <nav>
  140. <ul class="flex flex-wrap justify-center items-center">
  141. <li class="mr-6">
  142. <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="">
  143. <svg xmlns="http://www.w3.org/2000/svg" class="mb-px mr-1.5" width="18" height="18" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" focusable="false">
  144. <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"/>
  145. </svg>
  146. <span>Home</span>
  147. </a>
  148. </li>
  149. <li class="mr-6">
  150. <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">
  151. <svg xmlns="http://www.w3.org/2000/svg" class="mb-px mr-1.5" width="18" height="18" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" focusable="false">
  152. <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"/>
  153. </svg>
  154. <span>Live Demo</span>
  155. </a>
  156. </li>
  157. <li class="mr-6">
  158. <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">
  159. <svg xmlns="http://www.w3.org/2000/svg" class="mb-px mr-1.5" width="18" height="18" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" focusable="false">
  160. <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"/>
  161. </svg>
  162. <span>Live Examples</span>
  163. </a>
  164. </li>
  165. <li class="mr-6">
  166. <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">
  167. <svg xmlns="http://www.w3.org/2000/svg" class="mb-px mr-1.5" width="18" height="18" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" focusable="false">
  168. <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"/>
  169. </svg>
  170. <span>Github</span>
  171. </a>
  172. </li>
  173. <li class="mr-6">
  174. <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">
  175. <svg xmlns="http://www.w3.org/2000/svg" class="mb-px mr-1.5" width="18" height="18" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" focusable="false">
  176. <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"/>
  177. </svg>
  178. <span>Discord</span>
  179. </a>
  180. </li>
  181. </ul>
  182. </nav>
  183. </div>
  184. <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">
  185. <span class="text-xs whitespace-nowrap">Powered by</span>
  186. <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>
  187. </a>
  188. </div>
  189. </template>
  190. </doc-sidebar>
  191. <div class="grow min-w-0 bg-body-bg">
  192. <!-- Render "toolbar" template here on api pages --><!-- Render page content -->
  193. <div class="flex">
  194. <div id="retype-main" class="min-w-0 p-4 grow md:px-16">
  195. <main class="relative pb-12 lg:pt-2">
  196. <div class="retype-markdown" id="retype-content">
  197. <!-- Rendered if sidebar right is enabled -->
  198. <div id="retype-sidebar-right-toggle"></div>
  199. <!-- Page content -->
  200. <h1 id="compute-threads">Compute Threads</h1>
  201. <p>pocketpy organizes its state by <code translate="no" v-pre>VM</code> structure.
  202. Users can have at maximum 16 <code translate="no" v-pre>VM</code> instances (index from 0 to 15).
  203. Each <code translate="no" v-pre>VM</code> instance can only be accessed by exactly one thread at a time.
  204. If you are trying to run two python scripts in parallel refering the same <code translate="no" v-pre>VM</code> instance,
  205. you will crash it definitely.</p>
  206. <p>However, there are two ways to achieve multi-threading in pocketpy.</p>
  207. <p>One way is to use a native threading library such as <code translate="no" v-pre>pthread</code>.
  208. You can wrap the multi-threading logic into a C function and bind it to pocketpy.
  209. Be careful and not to access the same <code translate="no" v-pre>VM</code> instance from multiple threads at the same time.
  210. You need to lock critical resources or perform a deep copy of all needed data.</p>
  211. <h2 id="computethread">ComputeThread</h2>
  212. <p>The other way is to use <code translate="no" v-pre>pkpy.ComputeThread</code>.
  213. It is like an isolate in Dart language.
  214. <code translate="no" v-pre>ComputeThread</code> is a true multi-threading model to allow you run python scripts in parallel without lock,
  215. backed by a separate <code translate="no" v-pre>VM</code> instance.</p>
  216. <p><code translate="no" v-pre>ComputeThread</code> is highly designed for computational intensive tasks in games.
  217. For example, you can run game logic in main thread (VM 0) and run world generation in another thread (e.g. VM 1).</p>
  218. <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
  219. subgraph Main Thread
  220. A[Game Start]
  221. B[Submit WorldGen Job]
  222. C[Frame 1]
  223. D[Frame 2]
  224. E[Frame 3]
  225. F[...]
  226. G[Get WorldGen Result]
  227. H[Render World]
  228. end
  229. subgraph WorldGen Thread
  230. O[Generate Biomes]
  231. P[Generate Terrain]
  232. Q[Generate Creatures]
  233. R[Dump Result]
  234. end
  235. A --&gt; B
  236. B --&gt; C
  237. C --&gt; D
  238. D --&gt; E
  239. E --&gt; F
  240. F --&gt; G
  241. G --&gt; H
  242. O --&gt; P
  243. P --&gt; Q
  244. Q --&gt; R
  245. B --&gt; O
  246. R --&gt; G</pre></div>
  247. <h4 id="mainpy"><code translate="no" v-pre>main.py</code></h4>
  248. <div id="mainpy-code-1" class="codeblock-wrapper"><doc-codeblock>
  249. <pre translate="no" class="language-python"><code v-pre class="language-python">import time
  250. from pkpy import ComputeThread
  251. thread = ComputeThread(1)
  252. print(&quot;Game Start&quot;)
  253. # import worldgen.py
  254. thread.exec('from worldgen import gen_world')
  255. print(&quot;Submit WorldGen Job&quot;)
  256. thread.submit_call('gen_world', 3, (100, 100), 10)
  257. # wait for worldgen to finish
  258. for i in range(1, 100000):
  259. print('Frame:', i)
  260. time.sleep(1)
  261. if thread.is_done:
  262. break
  263. error = thread.last_error()
  264. if error is not None:
  265. print(&quot;Error:&quot;, error)
  266. else:
  267. retval = thread.last_retval()
  268. biomes = retval['biomes']
  269. terrain = retval['terrain']
  270. creatures = retval['creatures']
  271. print(&quot;World Generation Complete&quot;, len(biomes), len(terrain), len(creatures))</code></pre>
  272. </doc-codeblock></div>
  273. <h4 id="worldgenpy"><code translate="no" v-pre>worldgen.py</code></h4>
  274. <div id="worldgenpy-code-1" class="codeblock-wrapper"><doc-codeblock>
  275. <pre translate="no" class="language-python"><code v-pre class="language-python">import time
  276. import random
  277. def gen_world(biome_count: int, terrain_size: tuple[int, int], creature_count: int) -&gt; dict:
  278. # simulate a long computation
  279. time.sleep(3)
  280. # generate world data
  281. all_biomes = [&quot;forest&quot;, &quot;desert&quot;, &quot;ocean&quot;, &quot;mountain&quot;, &quot;swamp&quot;]
  282. all_creatures = [&quot;wolf&quot;, &quot;bear&quot;, &quot;fish&quot;, &quot;bird&quot;, &quot;lizard&quot;]
  283. width, height = terrain_size
  284. terrain_data = [
  285. random.randint(1, 10)
  286. for _ in range(width * height)
  287. ]
  288. creatures = [
  289. {
  290. &quot;name&quot;: random.choice(all_creatures),
  291. &quot;x&quot;: random.randint(0, width - 1),
  292. &quot;y&quot;: random.randint(0, height - 1),
  293. }
  294. for i in range(creature_count)
  295. ]
  296. return {
  297. &quot;biomes&quot;: all_biomes[:biome_count],
  298. &quot;terrain&quot;: terrain_data,
  299. &quot;creatures&quot;: creatures,
  300. }</code></pre>
  301. </doc-codeblock></div>
  302. <p>Run <code translate="no" v-pre>main.py</code> and you will see the result like this:</p>
  303. <div id="worldgenpy-code-2" class="codeblock-wrapper"><doc-codeblock>
  304. <pre translate="no" class="language-none"><code v-pre class="language-none">Game Start
  305. Submit WorldGen Job
  306. Frame: 1
  307. Frame: 2
  308. Frame: 3
  309. Frame: 4
  310. World Generation Complete 3 10000 10</code></pre>
  311. </doc-codeblock></div>
  312. <p><code translate="no" v-pre>ComputeThread</code> uses <code translate="no" v-pre>pickle</code> module to serialize the data between threads.
  313. Parameters and return values must be supported by <code translate="no" v-pre>pickle</code>.
  314. See <a href="https://pocketpy.dev/modules/pickle/">pickle</a> for more details.</p>
  315. <p>Since <code translate="no" v-pre>ComputeThread</code> is backed by a separate <code translate="no" v-pre>VM</code> instance,
  316. it does not share any state with the main thread
  317. except for the parameters you pass to it.
  318. Therefore, common python modules will be imported twice in each thread.</p>
  319. <p>If you want to identify which VM instance the module is running in,
  320. 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
  321. before importing these modules.</p>
  322. <!-- Required only on API pages -->
  323. <doc-toolbar-member-filter-no-results></doc-toolbar-member-filter-no-results>
  324. </div>
  325. <footer id="retype-content-footer" class="clear-both">
  326. <nav id="retype-nextprev" class="print:hidden flex mt-14">
  327. <div class="w-1/2">
  328. <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/">
  329. <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>
  330. <span>
  331. <span class="block text-xs font-normal text-base-text-muted">Previous</span>
  332. <span class="block mt-1">Profiling</span>
  333. </span>
  334. </a>
  335. </div>
  336. <div class="w-1/2">
  337. <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/">
  338. <span>
  339. <span class="block text-xs font-normal text-right text-base-text-muted">Next</span>
  340. <span class="block mt-1">Undefined Behaviour</span>
  341. </span>
  342. <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>
  343. </a>
  344. </div>
  345. </nav>
  346. </footer>
  347. </main>
  348. <div id="retype-page-footer" class="print:border-none border-t border-base-border pt-6 mb-8">
  349. <footer class="flex flex-wrap items-center justify-between print:justify-center">
  350. <div id="retype-footer-links" class="print:hidden">
  351. <ul class="flex flex-wrap items-center text-sm">
  352. </ul>
  353. </div>
  354. <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>
  355. </footer>
  356. </div>
  357. </div>
  358. <!-- Rendered if sidebar right is enabled -->
  359. <!-- Sidebar right skeleton-->
  360. <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">
  361. <div class="pl-5">
  362. <div class="w-32 h-3 mb-4 bg-skeleton-bg rounded-full loading"></div>
  363. <div class="w-48 h-3 mb-4 bg-skeleton-bg rounded-full loading"></div>
  364. <div class="w-40 h-3 mb-4 bg-skeleton-bg rounded-full loading"></div>
  365. </div>
  366. </div>
  367. <!-- User should be able to hide sidebar right -->
  368. <doc-sidebar-right v-cloak></doc-sidebar-right>
  369. </div>
  370. </div>
  371. </div>
  372. <doc-search-mobile></doc-search-mobile>
  373. <doc-back-to-top></doc-back-to-top>
  374. </div>
  375. <div id="retype-overlay-target"></div>
  376. <script data-cfasync="false">window.__DOCS__ = { "title": "Compute Threads", level: 2, icon: "file", hasPrism: true, hasMermaid: true, hasMath: false, tocDepth: 23 }</script>
  377. </body>
  378. </html>