At Vimeo, on the transcoding team, we work a lot with Go, and a lot with C, for various tasks such as media ingest. This means we use CGO quite extensively, and consequently, have run into bits that are perhaps not very well documented, if at all. Below is my effort to document some of the problems we've run into, and how we fixed or worked around them.
Many of these are obviously wrong in retrospect, but hindsight is 20/20, and these problems do exist in many codebases currently.
Some are definitely ugly, and I much welcome better solutions! Tweet me at @daemon404 if you have any, or have your own CGO story/tips, please! I'd love to learn of them.
Table of Contents
// Examples | |
// Yes, "router.router" twice - this assumes that the router is being injected | |
// into the component. Otherwise lookup 'router:main' | |
// One of these will be of interest, figure out which one you want: | |
this.get('router.router.state'); | |
this.get('router.router.state.params'); | |
this.get('container').lookup('controller:application').currentPath; |
Worked 2015-09-08 for Phoenix 1.0.1 on Dokku 0.3.25.
These instructions assume you've set up Dokku. If not, go find a tutorial for that part. My notes for setting it up on Digital Ocean.
Create a Dokku app:
package main | |
import ( | |
"./binding" | |
"fmt" | |
) | |
func main() { | |
binding.PrintHello() | |
binding.Seed(1) | |
fmt.Println(binding.Random()) |
The MIT License (MIT) | |
Copyright (c) 2015 Justin Perry | |
Permission is hereby granted, free of charge, to any person obtaining a copy of | |
this software and associated documentation files (the "Software"), to deal in | |
the Software without restriction, including without limitation the rights to | |
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of | |
the Software, and to permit persons to whom the Software is furnished to do so, | |
subject to the following conditions: |
// Package lambda helps create workers that run in AWS’ Lambda service. | |
// The Lambda service is designed to run Node.js programs, so we have a very thin | |
// Node.js wrapper which is essentially an adapter between our Go worker programs | |
// and Lambda. Lambda runs our Node.js wrapper/adapter which then in turn runs | |
// our Go worker programs as child processes, communicating with them via stdio pipes | |
// and Unix exit codes. | |
// | |
// The interaction between the Lambda wrapper and our Go programs works like this: | |
// | |
// * The Node.js function is invoked by Lambda. Lambda passes an `event` parameter to |
defmodule MyApp do | |
use Application | |
def start(_type, _args) do | |
import Supervisor.Spec, warn: false | |
children = [ | |
Plug.Adapters.Cowboy.child_spec(:http, MyApp.Router, [], [ | |
dispatch: dispatch | |
]) |
package main | |
import "log" | |
import "time" | |
import "reflect" | |
// suggested via http://stackoverflow.com/a/8363629/87207 | |
func trace(s string) (string, time.Time) { | |
log.Println("START:", s) | |
return s, time.Now() |
I've taken the benchmarks from Matthew Rothenberg's phoenix-showdown, updated Phoenix to 0.13.1 and ran the tests on the most powerful machines available at Rackspace.
Framework | Throughput (req/s) | Latency (ms) | Consistency (σ ms) |
---|