kuon

kuon

I wrote a NIF which have function that can take a long time to run. To prevent the scheduler from being overloaded with long running functions (even if marked at dirty), I made my NIF threaded and it sends message back to erlang using enif_send.

I want to make those call synchronous from a “programmer point of view”. Similar to a Process.sleep() call.

I was wondering what was the best approach. To avoid messing with the caller message inbox and to have an isolated process to receive the message, I thought of using something like this:

task = Task.async(fn -> 
call_nif(self()) 
receive do 
<wait for nif response> 
end 
end)
Task.await(task)

Would that be a good approach?

Showing Posts 1 to 7

krasenyp

krasenyp

It could work but in my opinion it’s best to use a yielding NIF or spawn an extra process and use local means of communication.

kuon

kuon OP

My NIF is blocking and it is hard to make it non blocking, so I wrapped the entire function into a C thread, my NIF now spawn the thread and return immediately, then the thread sends the message. It seems to be a recommenced architecture in the documentation.

Threaded NIF - This is accomplished by dispatching the work to another thread managed by the NIF library, return from the NIF, and wait for the result. The thread can send the result back to the Erlang process using enif_send. Information about thread primitives is provided below.

Now my question is more about the user API which I want to make synchronous for API simplificy sake, so I thought of this task trick (which works fine). But I was wondering it was the right approach or if there was a more idiomatic way to do it.

In fact it is to make an async call synchronous in general, not really tied to a nif.

benwilson512

benwilson512

Author of Craft GraphQL APIs in Elixir with Absinthe

Why wrap it in a task at all? Can you simply have a function that calls the NIF and then does a receive right after?

What does this NIF do btw? How long does it run?

kuon

kuon OP

The calling process might have other messages in its inbox when I call this function, I didn’t want to mess with that. This nif does some GPU inference, it runs for about 5 seconds.

I know it could/should be an external port, but using nif I get all serialize/deserialize for free and it is very practical.

LostKobrakai

LostKobrakai

Namespacing and a selective receive would to that.

kuon

kuon OP

So I can just do receive do {:my_namespace, …} → <we are done> end and it will not mess with the inbox? I wasn’t sure of that.

LostKobrakai

LostKobrakai

I’ll remove the matches message from the inbox – but it’ll leave anything else as is.

— All posts loaded —

Where Next? Top

Trending in Questions Top

katta
I having some trouble figuring out if I have set myself too strict of standards for my production server. Currently I can handle 75% of r...
New
peck
Hi everyone. My team and I have been working on a fairly modest app based around video streaming and chat, but we’ve landed a customer t...
New
achenet
Hello, I’m trying to build a basic Phoenix web-app, and I’d like to use Tailwind. However, when I launch mix phx.server, I get an error...
New
bradley
I really like the adapter patterns that ecto, nebulex, waffle, etc. use and would love find something similar for a key management servic...
New
unaware8150
Hello folks! So at work, we are seeing some situations where we have to define some “fixed” strings that are used across the codebase in...
New
Alvinkariuki
How Can I Optimise Compile Time Dependencies I have been building an elixir application for about 2 years now. Many modules and files ha...
New

Other Trending Topics Top

budgie
A little off-topic, but I feel like people here have a good head on their shoulders. I used to be quite good at making software. Was luc...
New
KristerV
Hey. Is there anyone here who creates agents in their apps? Not talking about using agents, but creating them. I’m finding it pretty diff...
New
mudasobwa
I fully migrated to my own harness from Anthropic/Gemini and I think it’s time to share it. Welcome DSH, the DeepSeek Harness, fully writ...
New
jimsynz
Beam Bots (or just BB for short) is a framework for building fault-tolerant robotics applications in Elixir using familiar OTP patterns. ...
New
juhalehtonen
There has been a thread to discuss the Stack Overflow Developer Survey on this forum every year since 2018, so here’s yet another one for...
New
budgie
I love Elixir. It’s one of 2 programming languages I’ve ever fallen in love with. But I don’t use it anymore. Serverless was the promis...
New

We're in Beta

About us Mission Statement

Options

Thread Display Mode




Thread Preview

Skip Thread Previews