2017-11-13 7 views
2

고양이 효과 이동 기능을 사용하여 비동기 코드를 실행하려고합니다.고양이 효과에서 시프트 기능 사용

기능 구현 :

def asyncSendMsg(producer: KkProducer)(record: KkRecord) : IO[Either[String, RecordMetadata]] = 
    for { 
     res <- trySendMsg(producer)(record).shift(BlockingFileIO).shift(Main) 
    } yield(res) 

    def trySendMsg(producer: KkProducer)(record: KkRecord): IO[Either[String, RecordMetadata]] = 
    IO { 
     try { 
     Right(producer.send(record).get()) 
     } catch { 
     case e: Exception => Left(e.getMessage()) 
     } 
    } 

컴파일하려고, 나는 나타납니다

[error] /home/developer/Desktop/scala/PureProducer/src/main/scala/TheProducer.scala:51:43: value shift is not a member of cats.effect.IO[Either[String,org.apache.kafka.clients.producer.RecordMetadata]] 
[error]  res <- trySendMsg(producer)(record).shift(BlockingFileIO).shift(Main) 
[error]           ^
[error] one error found 
[error] (compile:compileIncremental) Compilation failed 
[error] Total time: 2 s, completed Nov 13, 2017 2:18:06 PM 

어떤 라이브러리 내가 이동 기능을 사용하기 위해 수입해야합니까?

val nonBlockingExecContext = ExecutionContext.fromExecutor(Executors.newFixedThreadPool(10)) 

val res = for { 
    _ <- IO { println(Thread.currentThread().getName) } 
    _ <- IO.shift(nonBlockingExecContext) 
    _ <- IO { println(Thread.currentThread().getName) } 
} yield() 

res.unsafeRunSync() 

수익률 :

답변

1

IO.shift는 전에 IO 호출을 호출하기 IO의 동반자 객체 (API가 고양이의 버전간에 변경되었습니다)에 정의되어, 당신은 이해의에서 사용할 수 있습니다

main 
pool-1-thread-1 
+0

어떻게 메인 스레드로 돌아갈 수 있습니까? –

+0

@zero_coding'unsafeRunSync()'가 반환되면, 당신은'main'으로 되돌아갑니다. –

+0

그리고 다른 스레드의 계산 된 값을 주 스레드의 변수에 할당합니까? –