coroutine

Golang入门

情到浓时终转凉″ 提交于 2020-08-17 08:49:20
文章目录 1.并发 1.1 创建goroutine 1.2 Go语言的协作程序(goroutine)和普通的协作程序(coroutine) 1.3 goroutine间的通信(channel) 1.3.1 使用通道发送数据 1.3.2 使用通道接收数据 1.3.3 通道的多路复用 1.4 同步(lock) 2. 反射 3. json (序列化) 1.并发 Go语言通过编译器运行时(runtime),从语言上支持了并发的特性。Go语言的并发通过goroutine特性完成。 goroutine类似于线程,但是可以根据需要创建多个goroutine并发工作。goroutine是由Go语言的运行时调度完成,而线程是由操作系统调度完成。 1.1 创建goroutine func main ( ) { go func ( ) { for i : = 0 ; i < 100 ; i ++ { fmt . Println ( "hello" , i ) } } ( ) for i : = 0 ; i < 100 ; i ++ { fmt . Println ( "nihao" , i ) } } 以上采用匿名函数的方式,也可采用函数的方式,略 1.2 Go语言的协作程序(goroutine)和普通的协作程序(coroutine) ● goroutine可能发生并行执行

UniRx精讲(一):UniRx简介&定时功能实现

早过忘川 提交于 2020-08-15 01:54:51
1.UniRx 简介 UniRx 是一个 Unity3D 的编程框架。它专注于解决时间上异步的逻辑,使得异步逻辑的实现更加简洁和优雅。 简洁优雅如何体现? 比如,实现一个“只处理第一次鼠标点击事件”这个功能,使用 UniRx 实现如下: Observable.EveryUpdate() .Where(_ => Input.GetMouseButtonUp(0)) .First() .Subscribe(_ => { // do something }); 代码做的事情很简单: 开启一个 Update 的事件监听。 每次 Update 事件被调用时,进行鼠标是否抬起的判断。 如果判断通过,则进行计数,并且只获取第一次点击事件。 订阅/处理事件。 如果在 Unity 中,使用传统的方式实现如上功能,首先要创建一个成员变量来记录点击次数/是否点击过,然后在脚本中创建一个 Update 方法来监听鼠标抬起的事件。 如果在 Update 方法中,除了实现鼠标事件监听这个功能之外,还要实现其他的功能。那么 Update 里就会充斥着大量的状态判断等逻辑。代码非常不容易阅读。 而 UniRx 提供了一种编程思维,使得平时一些比较难以实现的异步逻辑(比如以上这种),使用 UniRx 轻松搞定,并且不失代码的可读性。 当然 UniRx 的强大不仅仅如此。 它还可以: 优雅实现 MVP(MVC

如何在django视图中使用asyncio(协程)和ThreadPoolExecutor(多线程)

僤鯓⒐⒋嵵緔 提交于 2020-08-11 16:36:32
Django视图函数执行,不在主线程中,直接 loop = asyncio.new_event_loop() # 更不能 loop = asyncio.get_event_loop() 会触发 RuntimeError: There is no current event loop in thread 因为asyncio程序中的每个线程都有自己的事件循环,但它只会在主线程中为你自动创建一个事件循环。所以如果你asyncio.get_event_loop在主线程中调用一次,它将自动创建一个循环对象并将其设置为默认值,但是如果你在一个子线程中再次调用它,你会得到这个错误。相反,您需要在线程启动时显式创建/设置事件循环: loop = asyncio.new_event_loop() asyncio.set_event_loop(loop) 在Django单个视图中使用asyncio实例代码如下(有多个IO任务时)    from django.views import View import asyncio import time from django.http import JsonResponse class TestAsyncioView(View): def get(self, request, *args, **kwargs): """ 利用asyncio和async

unity 协同程序

好久不见. 提交于 2020-08-10 08:14:21
转自: https://www.cnblogs.com/zblade/p/9857808.html 一、什么是协同程序? 在主线程运行的同时开启另一段逻辑处理,来协助当前程序的执行,协程很像多线程,但是不是多线程,Unity的协程实在每帧结束之后去检测yield的条件是否满足。 协同程序和线程差不多,也就是一条执行序列,拥有自己独立的栈、局部变量和指针, 同时又与其他协同程序共享全局变量和其他大部分东西。 与线程区别 :一个具有多个线程的程序可以同时运行几个线程,而协同程序却需要彼此协作地运行。 就是说一个具有多个协同程序的程序在任意时刻只能和运行一个协同程序,并且正在运行的协同程序只会在显示地要求挂起(suspend)时,它的执行才会暂停。 一个协同程序可以处于四种不同的状态: 挂起(suspended) 运行(running) 死亡(dead) 正常(normal) https://www.cnblogs.com/zblade/p/9857808.html 二、常见使用协程的示例 经常,我们会利用monobehaviour的startcoroutine来开启一个协程,这是我们在使用unity中最常见的直观理解。在这个协程中执行一些异步操作,比如下载文件,加载文件等,在完成这些操作后,执行我们的回调。 举例说明: public static void Download

Returning a value produced in Kotlin coroutine

我与影子孤独终老i 提交于 2020-08-04 05:18:19
问题 I am trying to return a value generated from coroutine fun nonSuspending (): MyType { launch(CommonPool) { suspendingFunctionThatReturnsMyValue() } //Do something to get the value out of coroutine context return somehowGetMyValue } I have come up with the following solution (not very safe!): fun nonSuspending (): MyType { val deferred = async(CommonPool) { suspendingFunctionThatReturnsMyValue() } while (deferred.isActive) Thread.sleep(1) return deferred.getCompleted() } I also thought about

Kotlin Coroutines suspend fun + retrofit throws “No Retrofit annotation found” error

你。 提交于 2020-07-15 15:16:11
问题 I'm trying to use retrofit's coroutine support in 2.5.1-SNAPSHOT but I keep getting a strange exception. My retrofit service class has: @GET("weather") suspend fun getForecast(@Query("q") query: String, @Query("num_of_days") numDays: String = "1", @Query("format") format : String = "json", @Query("key") apiKey: String = API_KEY) : Weather And when I try to call it I get: 2019-05-18 13:57:01.507 27422-27477/com.my.app E/MainPresenter$onResume$$inlined$CoroutineExceptionHandler: Something went

Kotlin Coroutines suspend fun + retrofit throws “No Retrofit annotation found” error

拈花ヽ惹草 提交于 2020-07-15 15:16:07
问题 I'm trying to use retrofit's coroutine support in 2.5.1-SNAPSHOT but I keep getting a strange exception. My retrofit service class has: @GET("weather") suspend fun getForecast(@Query("q") query: String, @Query("num_of_days") numDays: String = "1", @Query("format") format : String = "json", @Query("key") apiKey: String = API_KEY) : Weather And when I try to call it I get: 2019-05-18 13:57:01.507 27422-27477/com.my.app E/MainPresenter$onResume$$inlined$CoroutineExceptionHandler: Something went

C++20 in g++10: generator not defined

会有一股神秘感。 提交于 2020-07-09 12:05:37
问题 This MCVE works fine in Visual Studio. #include <experimental/generator> #include <iostream> std::experimental::generator<int> f() { for (int i = 0; i < 10; ++i) co_yield i; } int main () { for (int i : f()) std::cout << i << ' '; return 0; } but in g++10, which is listed as having full support or C++20's coroutines, it does not. (Taking out experimental doesn't help.) I am compiling thus: g++ -g -std=c++2a -fcoroutines -c main.cpp . It complains that there is no include file generator, and

C++20 in g++10: generator not defined

狂风中的少年 提交于 2020-07-09 12:04:22
问题 This MCVE works fine in Visual Studio. #include <experimental/generator> #include <iostream> std::experimental::generator<int> f() { for (int i = 0; i < 10; ++i) co_yield i; } int main () { for (int i : f()) std::cout << i << ' '; return 0; } but in g++10, which is listed as having full support or C++20's coroutines, it does not. (Taking out experimental doesn't help.) I am compiling thus: g++ -g -std=c++2a -fcoroutines -c main.cpp . It complains that there is no include file generator, and

Update UI async call with coroutines

江枫思渺然 提交于 2020-07-08 09:32:55
问题 I've got to update the UI with an async call to the Room Database, but when I do I've got this error : android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. // FavoritesPresenter.kt GlobalScope.launch { favoritesView.showFavorites(ProductProvider.getAllProducts() as ArrayList<Product>) } // ProductProvider.kt fun getAllProducts() : MutableList<Product> { return dao.getAllProducts() } // ProductDao.kt @Query(