为什么这个订阅会阻塞主线程?

nPn

我正在尝试使用 RxRuby,并希望将从 tcp 套接字接收到的数据转换为可以使用的流。以下代码“有效”,因为从套接字接收的数据是流式传输的,即当新数据到达时,我收到“data =”消息,但订阅会阻塞。如果在subscription =语句后添加任何代码,则在关闭套接字之前它不会执行。我本来希望需要一个循环来防止程序立即完成。

require 'rx'
require 'socket'
Thread.abort_on_exception=true

class StellariumInterface
  attr_accessor :server, :client, :goto_stream

  def initialize(host:, port:)
    @host = host
    @port = port
    @server = TCPServer.new host, port
    @goto_stream = nil
    @client = nil
  end


  def accept
    puts "connecting"
    self.client = server.accept
    puts "connected"
  end

  def listen
    self.goto_stream = Rx::Observable.create do |observer|
      l = Thread.new do
        loop  do
          raw_data = client.recvfrom(1000)
          break if raw_data.first.empty?
          data = raw_data.first.unpack('ssqLl')
          p data
          observer.on_next(data)
          sleep 0.1
        end
        observer.on_completed
      end
    l.join
    end
  end



end

source = StellariumInterface.new host: 'localhost', port: 10001
source.accept
source.listen
subscription = source.goto_stream.subscribe(
  lambda { |x|  puts "data = #{x}" },
  lambda { |x|  puts "error "},
  lambda { puts "stream done "}
)
楔形马丁

recvfrom 是一个阻塞操作,即使它在一个新线程内,当“join”发生时,这意味着主线程将等待新创建的线程。如果删除“加入”,它应该允许线程保持独立,并且循环线程不会阻塞主线程。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么Future会阻塞主线程?

来自分类Java

为什么ForkJoinPool ::的invoke()阻塞主线程?

来自分类Dev

为什么要在主线程上订阅?

来自分类Dev

创建服务器后,C ++ httplib库为什么会阻塞我的主线程?

来自分类Dev

为什么这个Duckmap会阻塞?

来自分类Dev

为什么这个异步单元测试会永远阻塞线程?

来自分类Java

为什么此Future的方法阻塞了主线程?

来自分类Dev

为什么不断设置动画的UIActivityIndicator不会阻塞主线程?

来自分类Dev

为什么使用Parallel.ForEach时主线程被阻塞

来自分类Dev

为什么Handler.Post阻塞主线程

来自分类Java

为什么线程会阻塞我的JavaFX UI线程?

来自分类Java

如果join阻塞了主线程,为什么它不循环阻塞?

来自分类Dev

为什么 BackgroundService.ExecuteAsync 内部的阻塞调用不会阻塞主线程?

来自分类Dev

为什么这个函数会阻塞flutter的ui?

来自分类Dev

如何确定什么阻塞了主线程

来自分类Dev

为什么“ await”会阻塞kotlin中的线程?

来自分类Dev

为什么非 UI 线程会阻塞 UI?

来自分类Dev

回调任务,为什么UI线程会阻塞

来自分类Dev

为什么带有 await 关键字的异步方法仍然阻塞主线程?

来自分类Dev

为什么QTimer :: singleShot在时间1而不是0阻塞我的主线程

来自分类Dev

为什么 Dispatchqueue.main.async 仍然在主线程执行阻塞?

来自分类Dev

异步读取输出时,外部进程会阻塞主线程

来自分类Dev

dispatch_after是否会阻塞主线程?

来自分类Dev

QMessageBox会阻塞Qt中整个主线程的运行吗?

来自分类Dev

NSoperationQueue阻塞主线程

来自分类Dev

Laravel 主线程被阻塞

来自分类Dev

为什么阻塞系统调用会阻塞用户级线程的整个过程?

来自分类Dev

为什么休眠主线程会更改Java中正在运行的其他线程的行为?

来自分类Dev

为什么线程死机/阻塞?

Related 相关文章

  1. 1

    为什么Future会阻塞主线程?

  2. 2

    为什么ForkJoinPool ::的invoke()阻塞主线程?

  3. 3

    为什么要在主线程上订阅?

  4. 4

    创建服务器后,C ++ httplib库为什么会阻塞我的主线程?

  5. 5

    为什么这个Duckmap会阻塞?

  6. 6

    为什么这个异步单元测试会永远阻塞线程?

  7. 7

    为什么此Future的方法阻塞了主线程?

  8. 8

    为什么不断设置动画的UIActivityIndicator不会阻塞主线程?

  9. 9

    为什么使用Parallel.ForEach时主线程被阻塞

  10. 10

    为什么Handler.Post阻塞主线程

  11. 11

    为什么线程会阻塞我的JavaFX UI线程?

  12. 12

    如果join阻塞了主线程,为什么它不循环阻塞?

  13. 13

    为什么 BackgroundService.ExecuteAsync 内部的阻塞调用不会阻塞主线程?

  14. 14

    为什么这个函数会阻塞flutter的ui?

  15. 15

    如何确定什么阻塞了主线程

  16. 16

    为什么“ await”会阻塞kotlin中的线程?

  17. 17

    为什么非 UI 线程会阻塞 UI?

  18. 18

    回调任务,为什么UI线程会阻塞

  19. 19

    为什么带有 await 关键字的异步方法仍然阻塞主线程?

  20. 20

    为什么QTimer :: singleShot在时间1而不是0阻塞我的主线程

  21. 21

    为什么 Dispatchqueue.main.async 仍然在主线程执行阻塞?

  22. 22

    异步读取输出时,外部进程会阻塞主线程

  23. 23

    dispatch_after是否会阻塞主线程?

  24. 24

    QMessageBox会阻塞Qt中整个主线程的运行吗?

  25. 25

    NSoperationQueue阻塞主线程

  26. 26

    Laravel 主线程被阻塞

  27. 27

    为什么阻塞系统调用会阻塞用户级线程的整个过程?

  28. 28

    为什么休眠主线程会更改Java中正在运行的其他线程的行为?

  29. 29

    为什么线程死机/阻塞?

热门标签

归档