web_worker module supports creating client-side background tasks.
It is a limited API and should only be used for computational heavy calcuations on the client. If you’re doing something on the client that seems to be making the page unresponsive, then a web worker might be for you.
You will need to include the following script tags in your Native Libraries for this module to work:
<script src="_/theme/anvil-labs/worker.js" defer></script>
Create a worker module - say
def fib(num): a, b = 1, 0 i = 0 print(worker) # worker is a global object injected into worker module while i < num: a, b = a + b, a i += 1 worker.task_state["i"] = i return b
In your code use the
web_worker module call the
fib function as a background client side task
from anvil_labs.web_worker import Worker my_worker = Worker("fib_worker") class Form1(Form1Template): def fib_result(self, result): alert(result) def fib_error(self, error): raise error def timer_tick(self, state): if self.task.is_completed(): self.timer.interval = 0 else: print(self.task.get_state().get("i")) def button_1_click(self, **event_args): self.task = my_worker.launch_task("fib", 2**20) self.timer.interval = 1 my_worker.on_result(self.fib_result) my_worker.on_error(self.fib_error) # my_worker.on_state_change(self.fib_state_change)
A worker module, like
fib_worker above, can only import libraries from python’s standard lib.
Exceptions raised should be from the standard lib.
Only JSONable objects can be passed to and from the worker to the client.
A Worker object can only launch a single background task at any one time. You can create more Worker objects if you want multiple tasks to run in parallel.
The API for client side
web_worker matches Anvil’s API for launching and communicating with background tasks.
Using a Timer to check the current state of the web worker task will work in the same way.
There are 3 additions to the api -
You should pass a callback to these methods that can be used to receive information from the task object.