标签: blocking

Perl:阻塞信号没有延迟,应该是 - >提供测试代码

在Perl脚本中,我正在编写我遇到的问题是我阻止INTQUIT发出信号,在反引号中执行一个进程,然后取消阻塞INTQUIT信号.我想阻止一个INT或一个人QUIT到达子进程并将其杀死.

该脚本在代码中的正确位置处成功阻塞和解除阻塞,但是,它不会延迟信号并执行我在阻塞模式下配置的处理程序,正如许多引用所说的那样.我知道它是解锁的,因为我可以SIGINT在阻塞或解除阻塞命令之前或之后发送它并且它受到尊重.

操作系统:Linux 2.6.30 Perl版本:5.8.8

代码片段:

#!/usr/local/bin/perl

use POSIX qw(:signal_h);

$SIG{'INT'} = 'gracefulExit';
sub gracefulExit { print "Caught Signal = GOOD\n"; exit; }

print "Recieving a SIGINT works here\n";
sleep 5;
my $sigset = POSIX::SigSet->new;
my $blockset = POSIX::SigSet->new(SIGINT);
sigprocmask(SIG_BLOCK, $blockset, $sigset) or die "dying at block...\n";
print "Recieving a SIGINT doesn't work here [GOOD!] and is NOT delayed [WHY!?].\n";
`/bin/sleep 5`;
sigprocmask(SIG_UNBLOCK, $blockset) or die …
Run Code Online (Sandbox Code Playgroud)

c perl posix signals blocking

5
推荐指数
1
解决办法
620
查看次数

我应该使用什么线程模块来阻止磁盘IO阻塞网络IO?

我有一个Python应用程序,简而言之,从远程服务器接收数据,处理它,响应服务器,偶尔将处理后的数据保存到磁盘.我遇到的问题是要写入大量数据,并且保存过程可能需要超过半分钟.这显然是一种阻塞操作,因此在此期间网络IO会停止.我希望能够在后台进行保存操作,可以这么说,以便应用程序可以合理地快速地继续与服务器通信.

我知道,我也许需要某种线程模块来实现这一点,但我不能告诉区别是什么之间thread,threading,multiprocessing和各种其他选项.有人知道我在找什么吗?

python io multithreading nonblocking blocking

5
推荐指数
1
解决办法
1051
查看次数

为什么即使在使用SwingUtilities.invokeLater后我的GUI仍然挂起?

我有这个ActionListener在EDT中被调用.我的plot()函数计算量很大,很容易花费五秒钟.它使GUI按预期挂起.我添加了SwingUtilities.invokeLater代码,它仍然挂起.由于我正在为我的升沉计算产生一个单独的线程,GUI不应该响应吗?

final ActionListener applyListener = new ActionListener() 
        {
            @CommitingFunction
            public void actionPerformed(ActionEvent arg0) 
            {
                /*Don't do plotting in the EDT :)*/
                SwingUtilities.invokeLater(new Runnable() 
                {
                    public void run() 
                    {
                        plot();
                    }
                });
            }
        };
Run Code Online (Sandbox Code Playgroud)

java swing asynchronous blocking event-dispatch-thread

5
推荐指数
1
解决办法
2826
查看次数

异步方法使用Ruby调用Ajax

我正在使用XMPP,我有一个消息回调,它会在发送每条消息时被激活.我的目标是将消息到达的数据发送到回调中的API,并根据响应使用XMPP客户端发回一些内容.

  1. 用户类型消息(浏览器聊天客户端)
  2. 消息通过XMPP到达服务器
  3. 消息将发送到API
  4. 收到回复
  5. 响应被发送回聊天客户端.

我的代码如下

admin_muc_client.activate_message_callbacks do |m|            
  sender    = m.from.resource
  room_slug = m.from.node
  message   = m.body                  

  r = HTTParty.get('http://example.com/api/v1/query?msg=message')
  Rails.logger.debug(r.inspect)
  admin_muc_client.send_message("Message #{r.body}") if m.from.resource != 'admin'
end
Run Code Online (Sandbox Code Playgroud)

我担心的是,由于回调是偶然的,并且对API的请求将是阻塞调用,这可能成为整个应用程序的瓶颈.我更喜欢使用像AJAX这样的Javascript来激活请求,当响应可用时发送数据.我怎么能在Ruby中实现它?

我查看了delayed_job和backgroundrb,它们看起来像火灾和忘记操作的工具.我需要一些能够以异步方式使用响应激活回调的东西.

我真的很感激如何实现我想要的异步行为的一些帮助.我也熟悉像RabbitMQ这样的消息队列,我觉得这会增加很多复杂性.

ruby io asynchronous xmpp blocking

5
推荐指数
1
解决办法
4218
查看次数

如何阻止在Ruby中读取命名管道?

我正在尝试设置一个Ruby脚本,该脚本从循环中的命名管道读取,阻塞直到管道中的输入可用.

我有一个进程,定期将调试事件放入命名管道:

# Open the logging pipe
log = File.open("log_pipe", "w+") #'log_pipe' created in shell using mkfifo
...
# An interesting event happens
log.puts "Interesting event #4291 occurred"
log.flush
...
Run Code Online (Sandbox Code Playgroud)

然后我想要一个单独的进程,它将从此管道中读取并在事件发生时将事件打印到控制台.我试过使用这样的代码:

input = File.open("log_pipe", "r+") 
while true
  puts input.gets  #I expect this to block and wait for input
end
# Kill loop with ctrl+c when done
Run Code Online (Sandbox Code Playgroud)

我希望input.gets阻止,耐心等待,直到新的输入到达fifo; 但它会立即nil再次读取和循环,滚动控制台窗口的顶部.

我试过两件事:

  1. 我用"r"和"r +"打开了输入fifo - 我有同样的问题;

  2. 我试图确定我的写作过程是否正在发送EOF(我听说过它会导致读取FIFO关闭) - AFAIK它不是.

一些背景:

如果它有帮助,这里是我正在尝试做的"大图"视图:

我正在开发一款运行在基于Ruby的游戏引擎RGSS中的游戏.由于它没有很好的集成调试,我想在游戏运行时设置实时日志 - 当游戏中发生事件时,我希望消息显示在侧面的控制台窗口中.我可以使用类似于上面的编写器代码的代码将Ruby游戏代码中的事件发送到命名管道; 我现在正在尝试设置一个单独的进程,该进程将等待事件显示在管道中并在控制台到达时显示它们.我甚至不确定我需要Ruby来做这件事,但这是我能想到的第一个解决方案.

请注意,我正在使用mkfifocygwin,我碰巧安装了它; 我想知道这可能是我麻烦的根源. …

ruby named-pipes blocking

5
推荐指数
1
解决办法
2883
查看次数

C#:需要一个类似于Java的LinkedBlockingQueue的阻塞FIFO队列

需要类似java的东西LinkedBlockingQueue.

感兴趣的方法:messageQueue.poll(120000, TimeUnit.MILLISECONDS); 意思是..获取项目..如果在X单位时间你仍然没有项目...返回null

那+我必须是FIFO

一些谷歌搜索后(但还没有测试):我发现ConcurrentQueue(有FIFO行为),BlockingCollection(FiFO或没有FIFO?)

c# queue multithreading fifo blocking

5
推荐指数
1
解决办法
1441
查看次数

什么可能是套接字读取速度非常慢的原因?

我正在为我的客户端和服务器使用阻塞TCP套接字.每当我阅读时,我首先检查流上的数据是否可用select.我总是一次读写40个字节.虽然大多数读取需要几毫秒或更短,但有些只需要超过半秒.在我知道套接字上有可用数据之后.

我也在用 TCP_NODELAY

可能是什么原因造成的?

编辑2

我分析了发送和接收的每个数据包的时间戳,并发现只有当客户端在服务器写入下一个对象之前尝试读取对象时才会发生此延迟.例如,服务器写入对象编号x,之后客户端尝试读取对象x,然后服务器才能开始编写对象编号x + 1.这让我怀疑服务器端正在进行某种合并.

编辑

服务器正在侦听3个不同的端口.客户端逐个连接到每个端口.

有三个连接:一个连接从服务器经常向客户端发送一些数据.第二个只从客户端向服务器发送数据.第三个很少用于发送单字节数据.我正面临着第一次连接的问题.我正在检查使用select()该连接上的数据,然后当我为40字节读取时间戳时,我发现该读取大约需要半秒钟.

关于如何分析这个的任何指示都会非常有帮助

在linux上使用gcc.

rdrr_server_start(void) {
int rr_sd; int input_sd; int ack_sd; int fp_sd;

startTcpServer(&rr_sd, remote_rr_port); startTcpServer(&input_sd, remote_input_port); startTcpServer(&ack_sd, remote_ack_port); startTcpServer(&fp_sd, remote_fp_port);

connFD_rr = getTcpConnection(rr_sd); connFD_input = getTcpConnection(input_sd); connFD_ack= getTcpConnection(ack_sd); connFD_fp=getTcpConnection(fp_sd); }

static int getTcpConnection(int sd) { socklen_t l en;
struct sockaddr_in clientAddress; len = sizeof(clientAddress); int connFD = accept(sd, (struct sockaddr*) &clientAddress, &len); nodelay(connFD); fflush(stdout); return connFD; }

static void startTcpServer(int *sd, const int port) { …

c sockets tcp blocking

5
推荐指数
1
解决办法
5890
查看次数

停止阻塞呼叫的线程

我正在开发一个Windows窗体应用程序,以便在通过USB连接的设备上执行少量操作.对于所有操作,如读取,写入和其他操作,我们有一个自定义库.

用户点击按钮时完成写操作.

要读取,将创建一个单独的线程.可用库的问题是Read调用是阻塞的并且具有INFINITE Timeout.

如果连接失败,该线程会在Read函数调用时停止,因为只有在收到数据时此函数才会中断.

在这种情况下杀死这个线程的方法是什么?Thread.Abort()不起作用.

我正在使用C#进行编程.

c# thread-safety blocking winforms

5
推荐指数
1
解决办法
1139
查看次数

在Java中测试并发

根据清单12.3中的Java Concurrency in Practice书,我们可以使用以下示例代码测试并发代码:

void testTakeBlocksWhenEmpty() {
 final BoundedBuffer<Integer> bb = new BoundedBuffer<Integer>(10);
 Thread taker = new Thread() {
  public void run() {
   try {
    int unused = bb.take();
    fail(); // if we get here, it’s an error
   } catch (InterruptedException success) { }
  }
 };
 try {
  taker.start();
  Thread.sleep(LOCKUP_DETECT_TIMEOUT);
  taker.interrupt();
  taker.join(LOCKUP_DETECT_TIMEOUT);
  assertFalse(taker.isAlive());
 } catch (Exception unexpected) {
  fail();
 }
}
Run Code Online (Sandbox Code Playgroud)

假设执行了以下步骤:

  1. taker 线程启动。
  2. bb.take()成功返回,我们只需要一点点fail()方法就可以运行。
  3. 这称为interrupt()方法。
  4. 我们处于线程的catch障碍中taker

因此,我们目前处于困境,但实际上测试方法失败了。它失败了,我们从不知道。

这是正确的吗?如果是,我们该如何解决?

java testing concurrency multithreading blocking

5
推荐指数
1
解决办法
353
查看次数

C ++控制台输入块,因此我无法杀死线程

我的程序有许多不同的线程处理不同的事情,其中​​之一处理用户输入。

其他线程没有太多阻止调用的方式,那些阻止调用的线程是基于网络的,因此在套接字关闭时将被中断或正常返回。

但是,用户线程可以调用std::cin以获取用户输入。这样做的效果是,当所有其他线程都死掉时,用户线程仍然在用户输入上受阻,并且只会在下一次给出输入时终止。

我有什么办法可以在阻止之前检查是否有任何用户输入要抓取?

我了解cin.peek()存在,但根据我的经验,如果没有任何要读的内容,它将阻止。假定我正确使用了它

我的代码基本上是一个无限循环,当另一个线程切换条件变量时停止该循环:

void doLoop()
{
    while (running) //running is shared between all threads and all others die quickly when it is false. It's set to true before the threads are started
    {
        string input = "";
        getline(cin, input);

        //Handle Input

    }
}
Run Code Online (Sandbox Code Playgroud)

我在Windows上使用VS2013,无法使用外部库。我一直在使用windows.h和std。

c++ multithreading user-input blocking windows-8.1

5
推荐指数
1
解决办法
1935
查看次数