http://qs321.pair.com?node_id=11135580


in reply to Is this a way to Go Perl #1

Frankly, I'm surprised that this much works this well.

As for the synchronization issue, the canonical way to solve it in Go is with a sync.WaitGroup, like this:

package main import ( "C" "fmt" "os" "sync" ) func main() {} var wg sync.WaitGroup //export Yaph func Yaph() { fmt.Println("Every day I get in the queue") fmt.Println("To get on the bus that takes me to you") } //export Acme func Acme() { wg.Add(1) go func() { defer wg.Done() fmt.Println("I guess i'm a closure") fmt.Println (os.Getpid()) }() } //export Wait func Wait() { wg.Wait() fmt.Println("All async goroutines have terminated") }

Then, in the calling perl code:

#!/usr/bin/env perl use strict; use warnings; use FFI::Platypus; use feature qw ( say ); say qq($0 $$); my $ffi = FFI::Platypus->new( api => 1 ); $ffi->lib('./yaph.so'); $ffi->attach(Yaph => []); $ffi->attach(Acme => []); $ffi->attach(Wait => []); Yaph(); Acme() for 1..300; Wait(); END { say qq(Too much, Magic Bus!) for 1 .. 3; } __END__

This has the disadvantage of relying on a global variable on the Go side. I don't see any way of returning a waitgroup variable created on the fly from an exported Go function to be encapsulated into a Perl variable, then feed it back into a second Go function. Nor do I see any other way to influence the Go runtime from the Perl side.

Still, it's an impressive demonstration. Real multithreading in a Perl program! :P