Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: Return callables from callables in Deephaven UI #540

Merged
merged 8 commits into from
Jun 19, 2024

Conversation

mattrunyon
Copy link
Contributor

@mattrunyon mattrunyon commented Jun 10, 2024

Fixes #322. Will be required for full completion of #321.

Currently a little hard to test, but this should demonstrate it if you watch the JS debug logs on WidgetHandler.

Run this Python code.

  • The Normal button should behave the same as latest dh.ui.
  • The Nested button will return a callable as the direct result of the callback function. This should allow us to do const fn = await callable(args); basically. It is not called, but there is a log from WidgetHandler after 5-10s that it was cleaned up. Or you can use the Memory tab in dev tools and click the broom icon to trigger a manual GC.
  • The Double Nested button will return and wrap an object containing a new callable. You can filter the browser logs for WidgetUtils and look for callable ID result string which won't have the parsed function, but will contain the object representing it as well as the other parts of the returned object.
  • The Not serializable button will basically do nothing except log an error in the Python console. The returned result will include that it was a serialization error to JS, but we do nothing with it.
from deephaven import ui

@ui.component
def my_comp():
    on_press = ui.use_callback(lambda d: print(d), [])
    on_press_nested = ui.use_callback(lambda: print, [])
    on_press_double_nested = ui.use_callback(lambda: { "nestedFn": print, "some_val": 4 }, [])
    on_press_unserializable = ui.use_callback(lambda: set([1, 2, 3]), [])
    return [
        ui.button("Normal", on_press=on_press),
        ui.button("Nested", on_press=on_press_nested),
        ui.button("Double Nested", on_press=on_press_double_nested),
        ui.button("Not Serializable", on_press=on_press_unserializable)
    ]

c = my_comp()

@mattrunyon mattrunyon self-assigned this Jun 10, 2024
@mattrunyon mattrunyon requested a review from mofojed June 13, 2024 20:48
Comment on lines +149 to +151
// Do NOT add anything that logs result
// It creates a strong ref to the result object in the console logs
// As a result, any returned callables will never be GC'd and the finalization registry will never clean them up
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Would love a little blog post about this

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ya not sure what else would be covered in a blog post. Guess it could be on weakrefs in general

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

WeakRef, FinalizationRegistry, garbage collection - would be short and interesting

@mattrunyon mattrunyon requested a review from mofojed June 18, 2024 22:32
@mattrunyon mattrunyon merged commit 8322c2d into deephaven:main Jun 19, 2024
13 checks passed
@mattrunyon mattrunyon deleted the callable-from-callable branch June 19, 2024 05:42
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Callables returned from a callable to be tracked
2 participants