2011-12-24 66 views
2

我有一個多線程庫,其中我在不同的線程中調用sleep(3)。 我已經使用boost python爲它寫了python綁定。 現在它看起來像增強python搞亂睡眠(3)函數,因爲它暫停整個python程序等待。boost python sleep wrapper導致整個python程序進入睡眠狀態

請考慮我有這個boostmod.cpp文件

#include <boost/python.hpp> 
using namespace boost::python; 
BOOST_PYTHON_MODULE(boostmod) { 
    def("waiter",&::sleep); 
} 

(您可以使用編譯:)

$ g++ -fPIC -shared boostmod.cpp `python-config --cflags --libs` -lboost_python -o boostmod.so 

這是一個Python測試文件threadtest.py:

import time,sys,threading,boostmod 
from ctypes import * 
if __name__ == '__main__': 
    libc = CDLL("libc.so.6") # this only works in linux 
    for n in range(5): 
     if sys.argv[1] == "boost": 
      # this is slow 
      threading.Thread(target=boostmod.waiter,args=(3,)).start() 
     elif sys.argv[1] == "native": 
      # this is fast 
      threading.Thread(target=time.sleep,args=(3,)).start() 
     elif sys.argv[1] == "ctypes": 
      # this is fast 
      threading.Thread(target=libc.sleep,args=(3,)).start() 

結果如下:

$ time python threadtest.py boost 
    real 0m15.030s 
    user 0m0.024s 
    sys  0m0.005s 
$ time python threadtest.py native 
    real 0m3.032s 
    user 0m0.027s 
    sys  0m0.003s 
$ time python threadtest.py ctypes 
    real 0m3.030s 
    user 0m0.022s 
    sys  0m0.008s 

如果你觀察到的情況與:

$ watch -n1 ps -C python -L -o pid,tid,pcpu,state 

你可以看到,「本土」和「ctypes的」真正建立5個線程加,而「提升」的情況下僅具有一個主線程線。實際上,在「boost」情況下,「.start()」在「sleep()」函數中被阻塞。

回答

1

首先,我已經看到python中的time.sleep函數沒有使用sleep(3) systemcall。它使用timing out call of select(2) on stdin(在函數「floatsleep」中),以便它可以被中斷。

但是我也發現,如果你在wrapperPy_BEGIN_ALLOW_THREADSPy_END_ALLOW_THREADS圍繞升壓模塊功能寫這個現象似乎會消失。

所以這裏是允許與sleep(3)調用多線程的新的動力模塊代碼:

#include <boost/python.hpp> 
using namespace boost::python; 
void waiter(int seconds) { 
    Py_BEGIN_ALLOW_THREADS 
    ::sleep(seconds); 
    Py_END_ALLOW_THREADS 
} 
BOOST_PYTHON_MODULE(boostmod) { 
    def("waiter",&::waiter); 
} 
相關問題