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

SPVM::Go - Github

See Also

Author

Yuki Kimoto kimoto.yuki@gmail.com

Copyright & License

Copyright (c) 2023 Yuki Kimoto

MIT License