我收到这个错误:
Ticker ticked
unexpected fault address 0xb01dfacedebac1e
fatal error: fault
[signal SIGSEGV: segmentation violation code=0x1 addr=0xb01dfacedebac1e pc=0x105c4152e]
goroutine 17 [running, locked to thread]:
runtime.throw(0x105c74358, 0x5)
/usr/local/go/src/runtime/panic.go:616 +0x81 fp=0xc420050d48 sp=0xc420050d28 pc=0x105bd6951
runtime.sigpanic()
/usr/local/go/src/runtime/signal_unix.go:395 +0x211 fp=0xc420050d98 sp=0xc420050d48 pc=0x105beabf1
main.callme(0x105baefc0)
/Users/xxx/go/src/test2/test2.go:29 +0xce fp=0xc420050e90 sp=0xc420050d98 pc=0x105c4152e
main._cgoexpwrap_f53316e445a2_callme(0x105baefc0)
_cgo_gotypes.go:45 +0x2b fp=0xc420050ea8 sp=0xc420050e90 pc=0x105c4144b
runtime.call32(0x0, 0x7ffeea2482b0, 0x7ffeea248348, 0x8)
/usr/local/go/src/runtime/asm_amd64.s:573 +0x3b fp=0xc420050ed8 sp=0xc420050ea8 pc=0x105bfe7eb
runtime.cgocallbackg1(0x0)
/usr/local/go/src/runtime/cgocall.go:316 +0x19c fp=0xc420050f58 sp=0xc420050ed8 pc=0x105bb284c
runtime.cgocallbackg(0x0)
/usr/local/go/src/runtime/cgocall.go:194 +0xda fp=0xc420050fc0 sp=0xc420050f58 pc=0x105bb261a
runtime.cgocallback_gofunc(0x0, 0x0, 0x0, 0x0)
/usr/local/go/src/runtime/asm_amd64.s:826 +0x9b fp=0xc420050fe0 sp=0xc420050fc0 pc=0x105bffdbb
runtime.goexit()
/usr/local/go/src/runtime/asm_amd64.s:2361 +0x1 fp=0xc420050fe8 sp=0xc420050fe0 pc=0x105c00a31
go 代码是:
package main
import "time"
import "fmt"
import "C"
type convert func()
//export callme
func callme(fn convert) {
doneChan := make(chan bool)
go func() {
time.Sleep(time.Second * 5)
doneChan <- true
}()
ticker := time.NewTicker(time.Millisecond * 500)
for {
select {
case <- ticker.C:
fmt.Println("Ticker ticked")
fn()
case <- doneChan:
fmt.Println("Done")
return
}
}
}
func main() {
ticker := time.NewTicker(time.Millisecond * 1000)
time.Sleep(time.Millisecond * 1500)
ticker.Stop()
fmt.Println("Ticker stopped")
}
python代码是:
from ctypes import *
def print_tick():
print("hey")
return 0
lib = cdll.LoadLibrary("./test2.so")
CMPFUNC = CFUNCTYPE(c_int)
cmp_func = CMPFUNC(print_tick)
callme = lib.callme
callme(cmp_func)
这只是一个测试代码,看看我如何在 python 和 go 之间使用回调,如果可能的话。 理想情况下,python 端会启动 go 代码在后台运行。 go 引擎正在接收消息流,并且在接收到消息后,go 引擎将从 python 调用回调函数并将这些消息传递给 python。
最佳答案
这里的问题是“callme”的参数类型。 python代码使用ctypes给它一个C风格的函数指针。您的 Go 代码将其作为 Go 函数接收,但事实并非如此。
首先,“callme”需要这样定义:
func callme(fn C.convert)
然后需要定义C.convert。转到文档 https://golang.org/cmd/cgo/描述了如何将一段 C 代码添加到 Go 源文件中。
/*
typedef void (*convert) ();
*/
import "C"
由于不能直接调用函数指针,所以需要创建一个以指针为参数的C函数,并调用它。
/*
typedef void (*convert) ();
static inline void call_c_func(convert ptr) {
(ptr)();
}
*/
import "C"
现在可以使用 C.call_c_func 调用从 python 接收的回调函数,取代直接调用 fn()。
//fn()
C.call_c_func(fn)
关于python - 从 go 调用 python 回调指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50537792/
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
我有一个服务模型/表及其注册表。在表单中,我几乎拥有服务的所有字段,但我想在验证服务对象之前自动设置其中一些值。示例:--服务Controller#创建Action:defcreate@service=Service.new@service_form=ServiceFormObject.new(@service)@service_form.validate(params[:service_form_object])and@service_form.saverespond_with(@service_form,location:admin_services_path)end在验证@ser
我正在尝试编写一个将文件上传到AWS并公开该文件的Ruby脚本。我做了以下事情:s3=Aws::S3::Resource.new(credentials:Aws::Credentials.new(KEY,SECRET),region:'us-west-2')obj=s3.bucket('stg-db').object('key')obj.upload_file(filename)这似乎工作正常,除了该文件不是公开可用的,而且我无法获得它的公共(public)URL。但是当我登录到S3时,我可以正常查看我的文件。为了使其公开可用,我将最后一行更改为obj.upload_file(file
我正在阅读SandiMetz的POODR,并且遇到了一个我不太了解的编码原则。这是代码:classBicycleattr_reader:size,:chain,:tire_sizedefinitialize(args={})@size=args[:size]||1@chain=args[:chain]||2@tire_size=args[:tire_size]||3post_initialize(args)endendclassMountainBike此代码将为其各自的属性输出1,2,3,4,5。我不明白的是查找方法。当一辆山地自行车被实例化时,因为它没有自己的initialize方法
如何在ruby中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL
我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www
我需要一些关于TDD概念的帮助。假设我有以下代码defexecute(command)casecommandwhen"c"create_new_characterwhen"i"display_inventoryendenddefcreate_new_character#dostufftocreatenewcharacterenddefdisplay_inventory#dostufftodisplayinventoryend现在我不确定要为什么编写单元测试。如果我为execute方法编写单元测试,那不是几乎涵盖了我对create_new_character和display_invent
这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。
什么是ruby的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht
华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o