嵌入式Python中的线程:如何实现?
在尝试使用Python的C接口时,我开始思考如何在一个C程序中正确地通过Python的threading
包来创建线程。看起来,函数PyEval_EvalCode
等会在C函数完成执行一段Python代码后,立即结束它“拥有”的线程。简单来说,从C中运行以下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()
...会在for循环结束后立刻停止,因为控制权会返回到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代码会在一个信号量上“睡眠”,直到被告知要关闭。接下来的问题是,如何才能给这个线程发送信号以进行干净的关闭?同样,“主”代码块可以简单地对所有线程调用join();然后这些线程需要从C中接收信号。
非常感谢大家的解决方案……
1 个回答
2
你有没有包含pthread这个库?如果Python发现没有真正的线程可用,它就会使用一些虚假的线程来代替。