作为练习,我想将一些线程化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
}
感谢!!!
答案 0 :(得分:3)
CPython的“并发问题”基本上只是无法在同一个进程中使用多个核心(你需要多个进程) - 除此之外,Python的线程能力不是所有与C不同的东西(虽然它更容易移植到/来自Java的早期线程能力,因为那是threading
模块[[松散]]基于的)。线程在执行I / O或休眠时会对其他线程产生控制权(time.sleep(0)
是一种流行的方式来表示“如果需要可以控制产量,或者继续使用此线程”),或者在一定数量之后先发制人自上次线程切换以来的字节码指令。
对于“资源获取是初始化”(RAAI),在C ++中(但不是在C中),您使用适当的局部变量获得,您可以使用try
/ finally
,就像在Java中一样,或者您可以使用with
语句 - with somelock:
,其中somelock
是threading.Lock
的实例,执行获取,执行语句的正文,然后确保执行释放该正文是否正常终止或异常终止 - 我看到你在代码中没有这么做,但这确实意味着线程的异常终止会使锁定“保持”。
答案 1 :(得分:2)
将代码移植到python应该是直截了当的:python的线程模块在讨论线程(线程,锁,条件变量等)时有所有常见的嫌疑。
你可能听说过python的线程支持是GIL(全局解释器锁)。 Python只允许一次执行一个python字节码操作,因此实际上你的应用程序将运行“单线程”(因为一次只运行一个线程)。如果你谷歌搜索它,你会发现很多很多文章。
这并不意味着您的程序不需要担心线程安全性,例如:您仍需要使用互斥锁正确保护共享数据结构。