Причина ошибки при выполнении GO скрипта (go-curl)?

Необходимо осуществить запрос к нескольким страницам через multi_curl, после чего обработать полученные данные в функции. Есть код (пример):
package main

import (
    "fmt"
    "time"
    curl "github.com/golang-basic/go-curl"
)

func callback(ptr []byte, userdata interface{}) bool {
    fmt.Printf("Size: %v\n", len(ptr))
    return true
}

func main() {
    mc := curl.MultiInit()

    url := []string{
        "http://api.sypexgeo.net/json/12.34.56.78",
        "http://api.sypexgeo.net/json/123.45.67.89",
    }

    for _, u := range url {
        easy := curl.EasyInit()

        easy.Setopt(curl.OPT_URL, u)
        easy.Setopt(curl.OPT_FOLLOWLOCATION, 1)
        easy.Setopt(curl.OPT_WRITEFUNCTION, callback)

        mc.AddHandle(easy)
    }

    defer mc.Cleanup()

    for {
        nRunning, _ := mc.Perform()

        if nRunning == 0 {
            fmt.Println("exit")
            break
        }

        time.Sleep(time.Millisecond * 100)
    }
}

При его выполнении через раз возникает ошибка:
unexpected fault address 0xc20803a038
fatal error: fault
[signal 0xb code=0x2 addr=0xc20803a038 pc=0xc20803a038]

goroutine 16 [running]:
runtime.throw(0x7846a2)
	/usr/lib/go/src/pkg/runtime/panic.c:520 +0x69 fp=0x7f748a417f00 sp=0x7f748a417ee8
runtime: unexpected return pc for runtime.sigpanic called from 0xc20803a038
runtime.sigpanic()
	/usr/lib/go/src/pkg/runtime/os_linux.c:240 +0x13f fp=0x7f748a417f18 sp=0x7f748a417f00
created by _rt0_go
	/usr/lib/go/src/pkg/runtime/asm_amd64.s:97 +0x120

goroutine 19 [finalizer wait]:
runtime.park(0x4160e0, 0x793518, 0x787189)
	/usr/lib/go/src/pkg/runtime/proc.c:1369 +0x89
runtime.parkunlock(0x793518, 0x787189)
	/usr/lib/go/src/pkg/runtime/proc.c:1385 +0x3b
runfinq()
	/usr/lib/go/src/pkg/runtime/mgc0.c:2644 +0xcf
runtime.goexit()
	/usr/lib/go/src/pkg/runtime/proc.c:1445

goroutine 17 [syscall]:
runtime.goexit()
	/usr/lib/go/src/pkg/runtime/proc.c:1445
exit status 2


В чем может быть ошибка?
P.S> К сожалению стандартный net/http не подходит в силу некоторых особенностей задачи.
  • Вопрос задан
  • 372 просмотра
Решения вопроса 1
@BaronAleks Автор вопроса
Как было отмечено в комментариях к вопросу, ошибка возникала при доступе к одному объекту из нескольких потоков. В итоге отказался от использования go-curl и переписал модуль через net/http с использованием goroutine.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы