我正在寻找等效的TCL Create_Filehandler API。我在Google上找不到任何有用的东西。 我试图解决的问题陈述可以简单地说:使1 C ++线程在C ++线程上写入内容,并嵌入python解释器并在python循环上等待。然后使用python解释器的线程获得一些通知,并使用在其输入通道上接收的字符串进行一些处理。我在TCL中有当前的实现,它使用Create_FileHandler来提供这种行为。在python中寻找类似的东西。
粗略地说,守则看起来像:
void mainpythonloop(int argc , char * argc[])
{
Py_Initialize();
// Register a callback so that anything written onto the stdin is passed onto that and called . [NEED HELP HERE]
Py_Main(argc,argv); // Main Python loop , can either serve the input on its stdin or any other thread writing to its stdin. Should not wait on anything
Py_Finalize();
}
答案 0 :(得分:2)
我怀疑有几种方法可以达到你想要的效果。我假设c ++线程写入某个文件描述符并且python解释器线程需要休眠,直到文件描述符有要读取的数据。以下是一些方法:
from Tkinter import *
root = Tk()
def readCallback(loop):
print("File is readable.")
tkinter.createfilehandler(fd, tkinter.READABLE, readCallback)
root.mainloop()
from select import *
p = poll()
p.register(fd, POLLIN)
while True:
p.poll()
print("File is readable.")
import asyncio
def readCallback(loop):
print("File is readable.")
loop = asyncio.get_event_loop()
loop.add_reader(fd, readCallback)
loop.run_forever()
您也可以使用推荐的选择器模块,而不是Python 3.4的select模块。您还可以查看扭曲或类似的事件循环引擎。
答案 1 :(得分:0)
你似乎在说两件相互矛盾的事情。
...嵌入并等待python循环的python解释器。
和
python解释器线程不会睡觉......
对于一个线程通知另一个等待线程,在任何类型的上下文中,等待线程必须等待 on 某种同步原语;锁或管或其他一些。
两个python线程以这种方式进行通信的最方便的方法是使用Queue
。它的python代码可能看起来像这样:
import Queue, threading
def worker(q):
while True:
task = q.get()
frobnicate(task)
q.task_done()
work_queue = Queue.Queue()
worker_thread = threading.Thread(target=worker, args=(work_queue,))
worker_thread.run()
def do_task(task):
work_queue.put(task)
具体而言,worker
将重复弹出工作队列中的项目;在它空的时候阻塞。它以内部使用多个threading.Condition
锁来管理这种行为,其方式大多是透明的。特别是,在项目被添加到队列中或从队列中删除项目的短暂间隔期间,锁仅由生产者(对于无界队列)持有,这非常不可能在一小部分时间内完成。对于每个put()
/ get()
在嵌入场景中使用所有这些并没有太大的不同,在某个线程中调用上面的代码,获取对do_task
(或仅work_queue.put
)的引用,最终PyObject_Call
来自{{1}}发布主题。