如何在python中的后台线程上运行阻塞进程

时间:2014-05-21 19:12:52

标签: python multithreading

我有一个单元测试脚本,需要测试所有其余的api。与此同时,我还有一个生成消息的xmpp服务器。

我需要在单元测试中运行xmpp的一个实例来接收这些消息。但问题是xmpp是一个阻塞过程。

---> self.process(块= TRUE)

这导致单元测试失速。

有什么办法可以在后台线程上运行这个xmpp并继续接收msgs并在主线程上运行单元测试。如果是,我可以拥有一个我可以实现的代码片段。

提前致谢。

1 个答案:

答案 0 :(得分:1)

  1. 一种解决方案是在setUp()例程的后台启动服务器 - 即os.system('myserver &'),然后在测试结束时将其杀死,在tearDown()

  2. 如果您想直接控制服务器,请使用fork()并按照与#1大致相同的模式。

  3. 示例:

    import os, sys, subprocess, time, unittest
    
    def server():
        try:
            for _ in xrange(5, 0, -1):
                print 'ding'
                time.sleep(1)
        except KeyboardInterrupt:
            pass
    
    
    class TestClient(unittest.TestCase):
        def setUp(self):
            self.server_pid = None
            pid = os.fork()
            if not pid:             # child
                return server()
            # parent
            self.server_pid = pid
    
        def test1(self):
            print 'test server, PID',self.server_pid
            time.sleep(2)
    
        def tearDown(self):
            if not self.server_pid:
                return
            import signal
            os.kill(self.server_pid, signal.SIGINT)
    

    使用以下命令运行:

    python -m unittest ptest
    

    输出:

      

    测试服务器,PID 16490 ding ding .test服务器,PID无

         

    ----------------------------------------------- -----------------------在2.003s中进行1次测试