标签: coroutine

makecontext()/ swapcontext()函数是否与C++兼容

在unix环境中makecontext()/swapcontext(),函数族有时用于在C中实现协程.但是这些函数直接操作堆栈和执行流程.通常,当从C切换到C++时,这些低级功能完全不同.

所以问题是,如果使用makecontext()和实现协同程序会有任何问题swapcontext().当然,显然必须非常小心,异常永远不会逃脱这样的协同程序,因为堆栈上没有异常处理程序,程序很可能是段错误.但除此之外,C++在内部处理事物的方式makecontext()setcontext()修改执行路径之间是否存在任何不兼容性?

c++ posix coroutine

9
推荐指数
1
解决办法
2156
查看次数

boost :: asio :: yield_context:意外的forced_unwind异常

我特林写我的自定义异步功能的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)

c++ boost coroutine boost-asio

9
推荐指数
1
解决办法
2043
查看次数

Python3 asyncio"任务被破坏,但它正在等待"具有一些特定条件

这是简化的代码,它使用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)

coroutine python-3.x python-asyncio

9
推荐指数
2
解决办法
9001
查看次数

为什么我们需要 asyncio.coroutine 装饰器?

为什么我们需要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

python coroutine python-asyncio

9
推荐指数
1
解决办法
2548
查看次数

为什么以及何时使用Kotlin在Android中使用协同例程代替线程,因为没有并行性?

我正在经历共同惯例的概念,以及它在kotlin中的使用和实现.

我用Google搜索并阅读了几个答案,就其在架构和性能方面与线程的不同之处而言.

这里解释得很好,

"coroutine"和"thread"之间的区别?

很公平,合作例程很棒,没有内存开销,性能卓越,没有死锁,竞争条件等等,而且易于使用.

现在,这里有一些事情,我很困惑,并希望更清楚 -

  1. 什么时候应该在Android中使用协同例程和线程?或者我应该坚持只是合作惯例?
  2. 如果,我只是坚持使用协同例程,那么它将如何利用CPU核心,因为它在单个线程上运行.

协同例程很好用,但它如何利用多个内核来提高性能.

android coroutine kotlin kotlin-coroutines

9
推荐指数
1
解决办法
709
查看次数

谁负责协程的暂停和继续?

就异步编程而言,这可能是一个非常基本的问题,但是我尝试阅读有关该内容的信息,但找不到相同的任何资源。

假设:我对异步编程有一个总体思路:

当开始阻塞操作(网络调用,从数据库/文件读取)时,我们可以将其委派给内核线程,这将使我们的应用程序线程可用于其他作业。内核线程等待作业完成,并在作业完成时向应用程序线程提供回调。

协程:最近几天我一直在阅读有关Kotlin协程的信息。我认为明智的协程在语言上是不可知的。我一直得到的问题是:

如何suspensioncontinuation发生的协同例程。协程不是线程(操作系统给它们分配了处理器的一部分),而是tasks在要执行的线程上调度的。

谁一直在寻找正在执行的程序,并说此协程已达到挂起点,应将其从线程中删除。continuation应该在该线程上调度另一个需要从中重新启动的协程。至于我已经读过的Java Fibers将由a完成Fiber Scheduler,在Kotlin中是否类似?

预先感谢您的帮助。

asynchronous coroutine kotlin kotlin-coroutines

9
推荐指数
1
解决办法
161
查看次数

协程如何等待数据然后继续处理

我正在用 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)

coroutine kotlin kotlin-coroutines

9
推荐指数
1
解决办法
1万
查看次数

Android EditText 协程去抖动运算符,如 RxJava

我需要使 EditText 具有自动建议功能,并且我需要听取其输入。以编程方式设置时,我还需要忽略 EditText 更改。

想知道是否有解决方案可以在这种情况下使用 Coroutines 使 EditText 去抖动而不使用延迟。

android coroutine kotlin kotlin-coroutines

9
推荐指数
2
解决办法
4215
查看次数

runInTransaction 块中的挂起方法

使用以下代码时出现编译错误:

暂停函数只能在协程体内调用

有人可以向我解释为什么吗?我需要做什么才能使它工作(不使用@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)

在此先感谢您的帮助

android coroutine kotlin kotlin-coroutines

9
推荐指数
1
解决办法
949
查看次数

如何解决kotlin协程注释警告

让我来问

我使用 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)

如何解决这个警告?提前致谢

annotations coroutine kotlin build.gradle kotlin-coroutines

9
推荐指数
2
解决办法
3303
查看次数