2010-08-29 4 views
0

В качестве упражнения я хотел бы перенести некоторые функции потоковой программы на C (используя pthreads) на Python.Портирование потоковой программы на Python

Программа C запускает поток для (почти) непрерывной итерации по определенным каталогам, заполняя структуру данных своим содержимым; эти каталоги часто меняются с ума (это почтовая очередь).

Основная часть программы реагирует на содержимое этой структуры данных различными способами.

Из того, что я читал, у Python возникают проблемы с параллелизмом.
Могу ли я это реализовать?
Если да, есть ли у вас какие-либо советы?

Я только недавно начал использовать Python регулярно, и я люблю его.

FYI, исходный код напоминает это:

// 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 
} 

Спасибо !!!

ответ

3

«Проблемы с параллелизмом» с CPython в основном связаны с тем, что они не могут использовать несколько ядер из одного и того же процесса (для этого вам нужны несколько процессов), кроме того, возможности Threading Python aren ' t все, что отличается от C (хотя проще переносить в/из ранних возможностей потоковой передачи Java, так как на этом был модуль threading [[свободно]]]. Потоки будут давать управление другим потокам, когда они делают I/O, или спят (time.sleep(0) - это популярный способ сказать «контроль производительности, если необходимо, еще продолжение с этим потоком»), или упреждающе после определенного количества команд байт-кода, поскольку последний переключатель резьбы.

Для «приобретения ресурсов является инициализация» (РАИИ), который в C++ (но не в С) вы получаете с соответствующей локальной переменной, вы можете использовать try/finally, как и в Java, или вы можете использовать with заявление - with somelock:, где somelock - это экземпляр threading.Lock, выполняет приобретение, выполняет тело оператора, а затем гарантирует, что релиз будет выполняться независимо от того, заканчивается ли это тело как правило или исключение - я вижу, что вы не беспокоитесь об этом в своем коде , но это означает, что аномальное завершение потока оставит блокировку «проведенной».

2

Портирование кода на python должно быть прямолинейным: в потоковом модуле python есть все обычные подозреваемые при обсуждении потоков (потоки, блокировки, переменные условий и т. Д.).

Что вы, вероятно, слышали о поддержке потоковой передачи python, это GIL (глобальная блокировка интерпретатора). Python позволяет одновременно выполнять одну операцию байт-кода на основе python, поэтому практически ваше приложение будет работать «однопоточно» (как в одном потоке будет выполняться одновременно). Если вы Google для него, вы найдете много и много статей, написанных.

Это не значит, что вашей программе не нужно беспокоиться о безопасности потоков, однако: вам все равно необходимо правильно защитить общие структуры данных с помощью мьютексов.

+0

Thanks Vanza; Я был обеспокоен GIL, но зная, что единственным ограничением является многоядерность, очень полезно. – mikewaters

Смежные вопросы