将线程C程序移植到Python

时间:2010-08-29 00:07:06

标签: python multithreading

作为练习,我想将一些线程化C程序(使用pthreads)的一些功能移植到Python。

C程序产生一个线程(几乎)不断迭代某些目录,用它们的内容填充数据结构;这些目录经常变化疯狂(它是一个邮件队列)。

程序的主体以各种方式对该数据结构的内容作出反应。

据我所知,Python存在并发问题 我能够实现这个吗? 如果是的话,你有什么建议吗?

我刚刚开始经常使用Python,我很喜欢它。

仅供参考,源代码类似于:

// big struct for everything
struct context_t {
    struct datastruct_t data;
    pthread_t       my_thread;
    pthread_mutex_t my_mutex;
}

int thread_control;

// does the dirty work
void *thread_func(void *arg) {
    while ( thread_control == TH_RUNNABLE ) {
        // loop through dirs
        // fill up ctx->data
        sleep(1);
    }
    pthread_mutex_unlock ( my_mutex );
    thread_control = TH_STOPPED;
    pthread_exit(NULL);
}

int start_thread(struct context_t* ctx) {
    // get a mutex to control access to our data
    pthread_mutex_trylock(&ctx->my_mutex)
    thread_control = TH_RUNNABLE;
    // start the thread
    pthread_create ( &ctx->my_thread, NULL, thread_func, ctx );
}
int stop_thread() {
    thread_control = TH_STOPRQ;
}
int main() {
    struct context_t *ctx;
    start_thread(ctx);
    // do stuff
}

感谢!!!

2 个答案:

答案 0 :(得分:3)

CPython的“并发问题”基本上只是无法在同一个进程中使用多个核心(你需要多个进程) - 除此之外,Python的线程能力不是所有与C不同的东西(虽然它更容易移植到/来自Java的早期线程能力,因为那是threading模块[[松散]]基于的)。线程在执行I / O或休眠时会对其他线程产生控制权(time.sleep(0)是一种流行的方式来表示“如果需要可以控制产量,或者继续使用此线程”),或者在一定数量之后先发制人自上次线程切换以来的字节码指令。

对于“资源获取是初始化”(RAAI),在C ++中(但不是在C中),您使用适当的局部变量获得,您可以使用try / finally,就像在Java中一样,或者您可以使用with语句 - with somelock:,其中somelockthreading.Lock的实例,执行获取,执行语句的正文,然后确保执行释放该正文是否正常终止或异常终止 - 我看到你在代码中没有这么做,但这确实意味着线程的异常终止会使锁定“保持”。

答案 1 :(得分:2)

将代码移植到python应该是直截了当的:python的线程模块在讨论线程(线程,锁,条件变量等)时有所有常见的嫌疑。

你可能听说过python的线程支持是GIL(全局解释器锁)。 Python只允许一次执行一个python字节码操作,因此实际上你的应用程序将运行“单线程”(因为一次只运行一个线程)。如果你谷歌搜索它,你会发现很多很多文章。

这并不意味着您的程序不需要担心线程安全性,例如:您仍需要使用互斥锁正确保护共享数据结构。