首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在线程中扭曲运行

在线程中扭曲运行
EN

Stack Overflow用户
提问于 2019-05-17 07:39:50
回答 2查看 216关注 0票数 0

python新入门twisted

我的团队希望我让一些现有的代码在单独的线程中运行。

我想了一个虚构的例子:

代码语言:javascript
运行
复制
from twisted.internet import threads, reactor
from twisted.internet.defer import inlineCallbacks
from time import sleep


class SomeClass(object):
    def __init__(self):
        self.working = False

    def set_working(self, is_working):
        self.working = is_working
        print 'Flag set to {}'.format(is_working)

    @inlineCallbacks
    def do_worker_thread(self):

        # I want to make this call on the main thread
        self.set_working(True)

        # I want to do all this garbage on a separate thread and keep trucking on the main thread
        # This mimics some calls in the real code. There is a call to deferToThread and a try
        # except block there.
        def thread_proc():
            try:
                for i in range(0, 100):
                    print 'Step %d starting'.format(i)
                    self.execute_step(i)
            except Exception:
                print 'An exception happened'
        reactor.callInThread(thread_proc)

        # When the worker thread is done, I want to call back 'on_thread_work_done'

    def execute_step(self, num):
        sleep(num)
        print 'Worker thread: %d'.format(num)

    def on_thread_work_done(self):
        """I want to be called back when the worker thread is done"""
        self.set_working(False)

    @inlineCallbacks
    def do_main_thread(self):
        for c in range(ord('a'), ord('z')+1):
            sleep(c)
            print 'Main thread: {}'.format(c)


if __name__ == "__main__":
    someClass = SomeClass()
    result = someClass.do_worker_thread()
    result.addCallback(someClass.do_main_thread())

    reactor.run()

do_worker_thread上的东西目前运行在主线程上。我放了一个评论在那里,我想让它在一个单独的线程中运行。重要的是,do_worker_thread必须立即返回。

我希望输出如下所示:

代码语言:javascript
运行
复制
Flag set to True
Step 0 starting
Main thread: a
Worker thread: 0
Worker thread: 1
Main thread: b
Worker thread: 2
Main thread: c
...

如何更改do_worker_thread中的内容,使我的set_working调用在主线程上,并且在辅助线程完成其工作之前不会设置为False?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-05-18 01:55:46

试着试一试。它使用callFromThread()来调度主线程上的工作。

代码语言:javascript
运行
复制
from twisted.internet import threads, reactor
from twisted.internet.defer import inlineCallbacks, returnValue
from time import sleep


class SomeClass(object):
    def __init__(self):
        self.working = False

    def set_working(self, is_working):
        self.working = is_working
        print 'Flag set to {}'.format(is_working)

    @inlineCallbacks
    def do_worker_thread(self):

        # I want to make this call on the main thread
        self.set_working(True)

        # I want to do all this garbage on a separate thread and keep trucking on the main thread
        # This mimics some calls in the real code. There is a call to deferToThread and a try
        # except block there.
        def thread_proc():
            try:
                for i in xrange(0, 10):
                    print 'Step {} starting'.format(i)
                    self.execute_step(i)
            except Exception:
                print 'An exception happened'

        yield threads.deferToThread(thread_proc)

        # When the worker thread is done, I want to call back 'on_thread_work_done'
        self.on_thread_work_done()

        returnValue(17)

    def execute_step(self, num):
        sleep(1)
        print 'Worker thread: {}'.format(num)

    def on_thread_work_done(self):
        """I want to be called back when the worker thread is done"""
        self.set_working(False)

    def do_main_thread(self):
        for i in [chr(x) for x in range(ord('a'), ord('z')+1)]:
            print 'Main thread: {}'.format(i)
            sleep(1)

    def thread_done(self, result):
        print 'Thread done: {}'.format(result)

if __name__ == "__main__":
    someClass = SomeClass()
    # Schedule the threaded work
    result = someClass.do_worker_thread().addCallback(someClass.thread_done)
    # Schedule the main thread work
    reactor.callFromThread(someClass.do_main_thread)
    reactor.run()
票数 1
EN

Stack Overflow用户

发布于 2019-05-17 12:25:13

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

https://stackoverflow.com/questions/56177860

复制
相关文章

相似问题

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