# Async runtime
PythonNative runs a single framework-wide ``asyncio`` event loop **on
the platform's main thread**, pumped as a guest of the native run loop
(``dispatch_async`` on iOS, ``Handler.post`` on Android, the Tk poll
loop in ``pn preview``). Every awaitable surface in the framework
schedules its work on this loop: ``async def`` components,
coroutine [`use_effect`][pythonnative.use_effect] callbacks,
[`use_resource`][pythonnative.use_resource],
[`use_query`][pythonnative.hooks.use_query],
[`use_mutation`][pythonnative.hooks.use_mutation],
[`fetch`][pythonnative.net.fetch],
[`AsyncStorage`][pythonnative.storage.AsyncStorage], the awaitable native
modules ([`Camera`][pythonnative.native_modules.camera.Camera] /
[`Location`][pythonnative.native_modules.location.Location] /
[`Notifications`][pythonnative.native_modules.notifications.Notifications]),
and [`Animated`][pythonnative.animated.Animated] composites.
::: pythonnative.runtime
options:
show_root_heading: false
show_root_toc_entry: false
members_order: source
filters: ["!^_"]
## Pattern: bridge a sync handler into async code
```python
import pythonnative as pn
@pn.component
def Toolbar():
async def export():
report = await build_report()
await save_to_disk(report)
return pn.Button("Export", on_press=lambda: pn.run_async(export()))
```
## Next steps
- Walk through the async surface end-to-end:
[Async + data guide](../guides/async.md).