代码之家  ›  专栏  ›  技术社区  ›  mikewaters

将线程C程序移植到python

  •  0
  • mikewaters  · 技术社区  · 14 年前

    作为练习,我想将线程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 回复  |  直到 14 年前
        1
  •  3
  •   Alex Martelli    14 年前

    与CPython有关的“并发问题”基本上只不过是不能在同一个进程中使用多个核(需要多个进程)——除此之外,Python的线程能力与C的线程的能力也不尽相同(尽管从Java的早期线程能力出发更容易),因为什么 threading 模块是基于[松散]]的。当线程执行I/O或休眠时,它们将向其他线程提供控制权。( time.sleep(0) 是一种流行的方法,可以说“如果需要的话就进行产量控制,否则就继续使用这个线程”),或者在最后一个线程切换之后,在一定数量的字节码指令之后先发制人。

    对于“资源获取是初始化”(RAAI),在C++(而不是C)中,您可以使用适当的局部变量获得,可以使用 try / finally ,就像在Java中一样,或者您可以使用 with 声明—— with somelock: 在哪里 somelock 是的实例 threading.Lock ,执行一个acquire,执行语句体,然后确保无论该体是正常终止还是异常终止,都会执行一个释放——我在代码中看到您不必担心这个问题,但这确实意味着线程的异常终止会使锁“保持”。

        2
  •  2
  •   vanza    14 年前

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

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

    但是,这并不意味着您的程序不需要担心线程安全:例如,您仍然需要使用互斥体适当地保护共享数据结构。