我将rust的reqwest
的一些函数包装到req.lib
文件中,并通过使用cffi
成功地从python调用它。但是reqwest::blocking::Client
迫使我在python中使用多线程。我发现reqwest
可以在rust中以异步模式调用。我想知道有没有办法使req.lib
异步?即使是半异步对我来说也是可以的
例如,当前存根签名为:
#[no_mangle]
pub extern "C" fn urlopen(url: *const c_char) -> *mut c_char
我可以写一些类似于:
#[no_mangle]
pub extern "C" fn urlopen(url: *const c_char) -> u64 // return request unique id
#[no_mangle]
pub extern "C" fn is_finished(req_id: u64) -> bool // whether given request is done
#[no_mangle]
pub extern "C" fn fetch_result(req_id: u64) -> *mut c_char // fetch response
因此cffi
调用不再锁定主线程。我可以使用单个线程来调用多个请求。欢迎提供任何建议或最佳实践
异步代码通过特殊的运行时执行,对于python和rust,它们是不同的且不兼容的库。在这里,您不能简单地在不同语言之间共享未来,它必须在创建它的同一语言中运行
对于您的示例,这意味着您需要在rust executor(例如在tokio)中运行
Client
,然后从中获得反馈。最简单的方法是创建一个全局的:然后在生成之后,您需要有一个反馈,因此您可以使用两个带有状态和结果的映射:
这里,对于正在创建的每个} ,这会延迟执行结果。因此,可以检查它是否完成:
urlopen
请求^{那么,获取结果相当简单:
Playground链接
请记住,上述解决方案有其优点:
还有一些重要的缺点:
RESULTS
生长不定且从不清除李>STATUSES
在is_finished
获得写访问权,不过最好先获得读访问权李>相关问题 更多 >
编程相关推荐