Python相当于TCL Create_FIleHandler

时间:2014-04-09 11:26:11

标签: python tcl

我正在寻找等效的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();

}

2 个答案:

答案 0 :(得分:2)

我怀疑有几种方法可以达到你想要的效果。我假设c ++线程写入某个文件描述符并且python解释器线程需要休眠,直到文件描述符有要读取的数据。以下是一些方法:

使用Tkinter和类似的TCL API调用:

from Tkinter import *

root = Tk()

def readCallback(loop):
    print("File is readable.")

tkinter.createfilehandler(fd, tkinter.READABLE, readCallback)

root.mainloop()

使用poll()或select()接口:

from select import *

p = poll()
p.register(fd, POLLIN)

while True:
    p.poll()
    print("File is readable.")

使用Python> = 3.4和asyncio:

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模块。您还可以查看扭曲或类似的事件循环引擎。

asyncio watch file descriptors

Tkinter createFileHandler

答案 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}}发布主题。