2010-07-01 2 views
5

При экспериментировании с API-интерфейсом Python (python.org) я обнаружил, что задаюсь вопросом, как правильно создавать потоки через пакет Python threading, когда сам Python встроен в программу на языке C. Функции PyEval_EvalCode и kin кажутся прекращением потоков, которые он «владеет», как только функция C завершит оценку блока кода Python. Грубо говоря, выполнив следующую Python из C ...Нити Python во встроенном Python: Как?

import threading, time 

class MyThread(threading.Thread): 
    def __init__(self, num): 
     self.num = num 
     threading.Thread.__init__(self) 
    def run(self): 
     print "magic num = %d" % self.num 

for x in xrange(1000): 
    MyThread(x).start() 

... остановится полностью, как только для отделки петель и управление возвращается обратно из PyEval_EvalCode (или такой) функции C. Мы можем наблюдать, что это дает усеченный выход.

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

for x in xrange(100): 
    MyThread(x).start() 

# Don't leave just yet; let threads run for a bit 
time.sleep(5) # Adjust to taste 

Я подозреваю, что это возможно подход заключается в создании нового системного потока, посвященного внедрению и запуску Python. После нереста потоков Python код Python будет спать на семафоре или что-то еще до тех пор, пока ему не будет предложено закрыть его. Тогда будет ли вопрос, как можно передать поток для аккуратного отключения? Аналогично, «основной» блок может просто присоединяться() для всех потоков; нити, то необходимо будет сигнализировать из С.

Solutions высоко оценили ..

ответ

1

Включили вы библиотеку PTHREAD? Python вернется к фиктивным потокам, если обнаружит, что реальные потоки недоступны

+0

Исполняемый файл динамически связывается с libpthread. –