Name
SPVM::Go - Goroutines of The Go Programming Language
Description
Go class in SPVM provide the features of goroutines and channels in Go language.
Usage
use Go;
Go->go(method : void () {
my $ch = Go->make;
Go->go([has ch : Go::Channel = $ch] method : void () {
my $ch = $self->{ch};
$ch->write(1);
});
my $ok = 0;
my $value = (int)$ch->read(\$ok);
});
Go->gosched;
Details
Go class provides a runtime environment that implements Goroutines and Channels, mimicking the behavior of the Go programming language.
Unlike standard polling-based implementations that consume CPU cycles while waiting, this module leverages the high-performance event loop provided by libuv.
Efficient Waiting via Event Loop
When a Goroutine performs an operation that requires waiting, such as:
Timer-based waiting (e.g.,
time.sleep)I/O operations (e.g., reading/writing sockets)
Channel communication (waiting for data or space)
The scheduler does not use busy-waiting or idle-looping. Instead, it registers the operation with the libuv event loop and suspends the Goroutine.
The event loop puts the process into a low-power wait state, consuming virtually zero CPU resources while waiting for the OS to signal that the event is ready. Once the event occurs (e.g., a timer expires, data arrives, or a channel becomes ready), the event loop notifies the scheduler, which then resumes the Goroutine efficiently.
This architecture ensures high scalability and low CPU usage, allowing for thousands of concurrent Goroutines to coexist within a single SPVM process without significant overhead.
Class Methods
go
static method go : void ($task : Callback);
Creates a goroutine.
make
static method make : Go::Channel ($capacity : int = 0);
Creates a channel(Go::Channel) given the capacity of its buffer $capacity.
new_select
static method new_select : Go::Select ();
Creats a new Go::Select object.
gosched
static method gosched : void ();
Suspends the current goroutine.
The control is transferred to the scheduler.
Exceptions:
This method must be called from the main thread. Otherwise an exception is thrown.
gosched_io_read
static method gosched_io_read : void ($fd : int, $timeout_duration : Go::Duration_1l = undef);
Suspends the current goroutine for IO reading given the file descriptor $fd and the value of the timeout nanosecnods $timeout_duration.
The control is transferred to the scheduler.
Exceptions:
This method must be called from the main thread. Otherwise an exception is thrown.
$timeout must be greater than 0. Otherwise an exception is thrown.
$timeout must be less than or equal to Fn->INT_MAX. Otherwise an exception is thrown.
If IO timeout occurs, an exception is thrown set eval_error_id to the basic type ID of the Go::Error::IOTimeout class.
gosched_io_read_sec
static method gosched_io_read_sec : void ($fd : int, $timeout_sec : double = 0);
Same as "gosched_io_read"" in ", but the timeout is the seconds $timeout_sec.
gosched_io_write
static method gosched_io_write : void ($fd : int, $timeout_duration : Go::Duration_1l = undef);
Suspends the current goroutine for IO writing given the file descriptor $fd and the timeout $timeout.
The control is transferred to the scheduler.
Exceptions:
This method must be called from the main thread. Otherwise an exception is thrown.
$timeout must be greater than 0. Otherwise an exception is thrown.
$timeout must be less than or equal to Fn->INT_MAX. Otherwise an exception is thrown.
If IO timeout occurs, an exception is thrown set eval_error_id to the basic type ID of the Go::Error::IOTimeout class.
gosched_io_write_sec
static method gosched_io_write_sec : void ($fd : int, $timeout_sec : double = 0);
Same as "gosched_io_write"" in ", but the timeout is the seconds $timeout_sec.
sleep
static method sleep : void ($duration : Go::Duration_1l = undef)
Sleeps the nanoseconds $duration.
Exceptions:
This method must be called from the main thread. Otherwise an exception is thrown.
$seconds must be less than or equal to Fn->INT_MAX. Otherwise an exception is thrown.
sleep_sec
static method sleep_sec : void ($sec : double = 0);
Same as "sleep", but sleeps the seconds $sec.
ENV_DEBUG
static method ENV_DEBUG : int ();
Casts the value of ""SPVM_GO_DEBUG" environment variable to int type and returns it.
Modules
Enviroment Variables
SPVM_GO_DEBUG
Repository
See Also
The Go Programming Language - SPVM::Go is a porting of goroutines.
Coro - SPVM::Go uses goroutines.
Author
Yuki Kimoto kimoto.yuki@gmail.com
Copyright & License
Copyright (c) 2023 Yuki Kimoto
MIT License