在unix环境中makecontext()/swapcontext(),函数族有时用于在C中实现协程.但是这些函数直接操作堆栈和执行流程.通常,当从C切换到C++时,这些低级功能完全不同.
所以问题是,如果使用makecontext()和实现协同程序会有任何问题swapcontext().当然,显然必须非常小心,异常永远不会逃脱这样的协同程序,因为堆栈上没有异常处理程序,程序很可能是段错误.但除此之外,C++在内部处理事物的方式makecontext()和setcontext()修改执行路径之间是否存在任何不兼容性?
我特林写我的自定义异步功能的boost :: ASIO描述这里.
不过我与行获得的boost ::协程::详细:: forced_unwind例外result.get
#include <boost/chrono.hpp>
#include <boost/asio.hpp>
#include <boost/asio/spawn.hpp>
#include <boost/asio/steady_timer.hpp>
#include <iostream>
namespace asio = ::boost::asio;
template <typename Timer, typename Token>
auto my_timer (Timer& timer, Token&& token)
{
typename asio::handler_type<Token,
void (::boost::system::error_code const)>::type
handler (std::forward<Token> (token));
asio::async_result<decltype (handler)> result (handler);
timer.async_wait (handler);
return result.get (); // Got forced_unwind exception here.
}
int main ()
{
asio::io_service io;
asio::steady_timer timer (io, ::boost::chrono::seconds (1));
asio::spawn (io, [&] (asio::yield_context yield)
{
try {
std::cout << "my_timer …Run Code Online (Sandbox Code Playgroud) 这是简化的代码,它使用python3协同程序并为SIGING和SIGTERM信号设置处理程序以正确停止作业:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import argparse
import asyncio
import signal
import sys
def my_handler(signum, frame):
print('Stopping')
asyncio.get_event_loop().stop()
# Do some staff
sys.exit()
@asyncio.coroutine
def prob_ip(ip_addr):
print('Ping ip:%s' % ip_addr)
proc = yield from asyncio.create_subprocess_exec('ping', '-c', '3', ip_addr)
ret_code = yield from proc.wait()
if ret_code != 0:
print("ip:%s doesn't responding" % ip_addr)
# Do some staff
yield from asyncio.sleep(2)
# Do more staff
yield from asyncio.sleep(16)
@asyncio.coroutine
def run_probing():
print('Start probing')
# Do some staff
yield from …Run Code Online (Sandbox Code Playgroud) 为什么我们需要asyncio.coroutine装饰器?它提供什么功能?
例如:
# import asyncio
# @asyncio.coroutine
def gen():
value = yield("Started")
print(value)
a = gen()
a.send(None)
a.send("Done")
Run Code Online (Sandbox Code Playgroud)
现在,如果我取消对前两行的注释并使用asyncio.coroutine装饰器,我仍然会得到相同的输出。
我的意思是这已经是一个coroutine- 一个可以暂停并带参数传入的函数。为什么我需要用另一个coroutineie装饰它asyncio.coroutine?
我正在经历共同惯例的概念,以及它在kotlin中的使用和实现.
我用Google搜索并阅读了几个答案,就其在架构和性能方面与线程的不同之处而言.
这里解释得很好,
很公平,合作例程很棒,没有内存开销,性能卓越,没有死锁,竞争条件等等,而且易于使用.
现在,这里有一些事情,我很困惑,并希望更清楚 -
协同例程很好用,但它如何利用多个内核来提高性能.
就异步编程而言,这可能是一个非常基本的问题,但是我尝试阅读有关该内容的信息,但找不到相同的任何资源。
假设:我对异步编程有一个总体思路:
当开始阻塞操作(网络调用,从数据库/文件读取)时,我们可以将其委派给内核线程,这将使我们的应用程序线程可用于其他作业。内核线程等待作业完成,并在作业完成时向应用程序线程提供回调。
协程:最近几天我一直在阅读有关Kotlin协程的信息。我认为明智的协程在语言上是不可知的。我一直得到的问题是:
如何suspension和continuation发生的协同例程。协程不是线程(操作系统给它们分配了处理器的一部分),而是tasks在要执行的线程上调度的。
谁一直在寻找正在执行的程序,并说此协程已达到挂起点,应将其从线程中删除。continuation应该在该线程上调度另一个需要从中重新启动的协程。至于我已经读过的Java Fibers将由a完成Fiber Scheduler,在Kotlin中是否类似?
预先感谢您的帮助。
我正在用 kotlin 学习协程,我有一个问题,进程如何等待进程 1 完成,然后继续处理 2,从下面的示例中,我有一个使用 getNews 访问 API 服务器的对象网络(它运行良好并获取数据)我使用异步等待从refreshNews调用这个getNews,其目的是等待数据然后继续运行,但是“程序不等待”,它只是运行进程2然后进程1完成,所以我无法从API中捕获数据刷新新闻
// process 1 - calling api this running well can get the data see process 2
object Network {
var status : NewsApiStatus = NewsApiStatus.LOADING
private var viewModelJob = Job()
private val coroutineScope = CoroutineScope(viewModelJob + Dispatchers.Main)
fun getNews(filter: String, page: Int =1) : newsData? {
var allNews : newsData? = null
coroutineScope.launch {
RetrofitClient.instance.getAllNews(filter, page).enqueue(object: Callback<newsData>{
override fun onFailure(call: Call<newsData>, t: Throwable) {
status = NewsApiStatus.ERROR
}
override fun …Run Code Online (Sandbox Code Playgroud) 我需要使 EditText 具有自动建议功能,并且我需要听取其输入。以编程方式设置时,我还需要忽略 EditText 更改。
想知道是否有解决方案可以在这种情况下使用 Coroutines 使 EditText 去抖动而不使用延迟。
使用以下代码时出现编译错误:
暂停函数只能在协程体内调用
有人可以向我解释为什么吗?我需要做什么才能使它工作(不使用@Transaction注释)?
override suspend fun replaceAccounts(newAccounts: List<Account>) {
database.runInTransaction {
database.accountDao().deleteAllAccounts() // I have the error on this line
database.accountDao().insertAccounts(newAccounts) // Here too
}
}
@Dao
abstract class AccountDao : BaseDao<AccountEntity> {
@Query("DELETE FROM Account")
abstract suspend fun deleteAllAccounts()
}
Run Code Online (Sandbox Code Playgroud)
在此先感谢您的帮助
让我来问
我使用 kotlin 协程
@OptIn(DelicateCoroutinesApi::class)
GlobalScope.launch {
displaySura()
}
Run Code Online (Sandbox Code Playgroud)
并在构建选项卡中显示警告:
This annotation should be used with the compiler argument '-opt-in=kotlin.RequiresOptIn'
Run Code Online (Sandbox Code Playgroud)
如何解决这个警告?提前致谢
coroutine ×10
kotlin ×6
android ×3
c++ ×2
annotations ×1
asynchronous ×1
boost ×1
boost-asio ×1
build.gradle ×1
posix ×1
python ×1
python-3.x ×1