首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从虚拟线程中的调用执行主线程中的Python函数

从虚拟线程中的调用执行主线程中的Python函数
EN

Stack Overflow用户
提问于 2013-09-25 02:38:08
回答 1查看 26.2K关注 0票数 24

我有一个处理来自.NET远程处理的异步回调的Python脚本。这些回调在一个虚拟(工作)线程中执行。从我的回调处理程序内部,我需要调用我在脚本中定义的函数,但我需要该函数在主线程中执行。

主线程是向服务器发送命令的远程客户端。其中一些命令会导致异步回调。

基本上,我需要.NET的Invoke方法的等价物。这个是可能的吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-09-25 03:47:58

您希望使用Queue (现在是Python3中的queue )类来设置一个队列,虚拟线程使用函数填充该队列,并且主线程使用该队列。

代码语言:javascript
运行
复制
import Queue

#somewhere accessible to both:
callback_queue = Queue.Queue()

def from_dummy_thread(func_to_call_from_main_thread):
    callback_queue.put(func_to_call_from_main_thread)

def from_main_thread_blocking():
    callback = callback_queue.get() #blocks until an item is available
    callback()

def from_main_thread_nonblocking():
    while True:
        try:
            callback = callback_queue.get(False) #doesn't block
        except Queue.Empty: #raised when queue is empty
            break
        callback()

演示:

代码语言:javascript
运行
复制
import threading
import time

def print_num(dummyid, n):
    print "From %s: %d" % (dummyid, n)
def dummy_run(dummyid):
    for i in xrange(5):
        from_dummy_thread(lambda: print_num(dummyid, i))
        time.sleep(0.5)
    
threading.Thread(target=dummy_run, args=("a",)).start()
threading.Thread(target=dummy_run, args=("b",)).start()

while True:
    from_main_thread_blocking()

打印:

代码语言:javascript
运行
复制
From a: 0
From b: 0
From a: 1
From b: 1
From b: 2
From a: 2
From b: 3
From a: 3
From b: 4
From a: 4

然后永远阻塞

票数 32
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18989446

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档