嵌入式Python中的线程:如何实现?

5 投票
1 回答
1024 浏览
提问于 2025-04-16 00:41

在尝试使用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发现没有真正的线程可用,它就会使用一些虚假的线程来代替。

撰写回答