Photon v0.13.0 with offload
Dmitry Olshansky
dmitry.olsh at gmail.com
Mon Aug 18 15:20:14 UTC 2025
On Saturday, 16 August 2025 at 14:51:45 UTC, Dmitry Olshansky
wrote:
> On Saturday, 16 August 2025 at 09:43:02 UTC, GL wrote:
>> On Wednesday, 13 August 2025 at 13:28:26 UTC, Dmitry Olshansky
>> wrote:
>>
>>> I need to think a little more about it but I would likely
>>> ship it in the next release. Soonish :)
>>
>> Thank you!
>> I will wait with great impatience...
>
> With new version v0.12.2 basic ZeroMQd example runs fine. Of
> other things HTTP server finally scales very well up to 48
> cores and is faster than anything I've tried. (see photon-http
> 0.5.4)
Actually that should be 0.5.5 :)
And v0.13.0 brings new feature - offload to run compute intensive
tasks outside of scheduler. Certain syscalls are automatically
routed through it to avoid blocking fibers such as file I/O. Here
is simple example using goOnSameThread to make sure we are
actually sharing just a single eventloop thread out of many and
yet it doesn't block.
import photon;
double gauss(double a, double b, double function(double) f,
double step) {
double sum = 0.0;
for (double x = a; x < b; x += step) {
sum += (f(x+step) + f(x))/2 * step;
}
return sum;
}
void boom() {
throw new Exception("Boom!");
}
long fib(long n) {
if (n <= 2) return 1;
else {
return offload(() => fib(n-1)) + offload(() => fib(n-2));
}
}
void main() {
startloop();
go({
goOnSameThread({
writeln("Blocking computation");
writeln("Integral:", gauss(0.0, 10.0, x => x*x,
1e-7));
});
goOnSameThread({
writeln("Blocking computation");
writeln("Integral:", gauss(0.0, 10.0, x => x*x,
1e-7));
});
goOnSameThread({
writeln("Nonblocking computation");
writeln("Integral: ", offload(() => gauss(0.0, 10.0,
x => x*x, 1e-7)));
});
goOnSameThread({
writeln("Nonblocking computation");
writeln("Integral: ", offload(() => gauss(0.0, 10.0,
x => x*x, 1e-7)));
});
goOnSameThread({
writeln("Catching exception from offloaded
computation");
try {
offload(&boom);
assert(0);
} catch(Exception e) {
assert(e.msg == "Boom!");
}
});
goOnSameThread({
writeln("Recursive offload");
writeln("Fib(15):", offload(() => fib(15)));
});
});
runFibers();
}
Other photon examples:
https://github.com/DmitryOlshansky/photon/tree/master
More information about the Digitalmars-d-announce
mailing list