我应该如何在python中使用线程减少执行时间?

时间:2016-04-30 13:41:45

标签: python multithreading python-2.7 wxpython python-multithreading

当我使用以下代码时使用单线程时间是49.7秒,但随着我增加线程数如下

work1=TestThread(self,"worker1") 
work2=TestThread(self,"worker2") 

执行时间也在增加。

import time
import wx
import threading
from threading import Thread

# Define notification event for thread completion
EVT_RESULT_ID = wx.NewId()

def EVT_RESULT(win, func):
    """Define Result Event."""
    win.Connect(-1, -1, EVT_RESULT_ID, func)

class ResultEvent(wx.PyEvent):
    """Simple event to carry arbitrary result data."""
    def __init__(self, data):
        """Init Result Event."""
        wx.PyEvent.__init__(self)
        self.SetEventType(EVT_RESULT_ID)
        self.data = data

########################################################################
class TestThread(Thread):
    """Test Worker Thread Class."""

    #----------------------------------------------------------------------
    def __init__(self, wxObject,name):
        """Init Worker Thread Class."""
        Thread.__init__(self)
        self.name = name
        self.wxObject = wxObject
        self.start()    # start the thread

    #----------------------------------------------------------------------
    def run(self):
        """Run Worker Thread."""
        # This is the code executing in the new thread.
        start_time=time.time()
        print " Entering " + self.name + "\n"
        for i in range(1000):
            for a in range(1000):
                for b in range(1000):
                    pass
        print " execution time of "+ self.name +" is: " + str(time.time()-start_time) + "\n"
        aot=1
        wx.PostEvent(self.wxObject, ResultEvent(aot))

########################################################################
class MyForm(wx.Frame):

    #----------------------------------------------------------------------
    def __init__(self):
        wx.Frame.__init__(self, None, wx.ID_ANY, "Tutorial")

        # Add a panel so it looks the correct on all platforms
        panel = wx.Panel(self, wx.ID_ANY)
        self.displayLbl = wx.StaticText(panel, label="Amount of time since thread started goes here")
        self.btn = btn = wx.Button(panel, label="Start Thread")

        btn.Bind(wx.EVT_BUTTON, self.onButton)

        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(self.displayLbl, 0, wx.ALL|wx.CENTER, 5)
        sizer.Add(btn, 0, wx.ALL|wx.CENTER, 5)
        panel.SetSizer(sizer)

        # Set up event handler for any worker thread results
        EVT_RESULT(self, self.updateDisplay)

    #----------------------------------------------------------------------
    def onButton(self, event):
        """
        Runs the thread
        """
        self.displayLbl.SetLabel("Thread started!")
        work1=TestThread(self,"worker1")
        print threading.enumerate()
        print threading.activeCount()
        btn = event.GetEventObject()
        btn.Disable()

    #----------------------------------------------------------------------
    def updateDisplay(self, msg):
        """
        Receives data from thread and updates the display
        """
        t = msg.data
        if (t==1):
            self.btn.Enable()

#----------------------------------------------------------------------
# Run the program
if __name__ == "__main__":
    app = wx.App()
    frame = MyForm().Show()
    app.MainLoop()

单线程的输出是:

Entering worker1
[<_MainThread(MainThread, started 9360)>, <Thread(SockThread, started daemon 4984)>, <TestThread(worker1, started 5776)>]

3
 execution time of worker1 is: 49.2760000229
两个主题的

是:

Entering worker1
 Entering worker2
[<_MainThread(MainThread, started 8880)>, <Thread(SockThread, started daemon 8280)>, <TestThread(worker1, started 5788)>, <TestThread(worker2, started 12240)>]


4
 execution time of worker2 is: 113.527999878

 execution time of worker1 is: 114.292000055

为什么会这样发生。谁能解释一下?什么是SockThread? TIA

1 个答案:

答案 0 :(得分:1)

由于Global Interpreter Lock,你的主题在一个核心上互相争斗。全局解释器锁可以防止多个python线程一次运行,即使在多核系统上也是如此。因此,要并行执行多个cpu绑定任务,必须使用进程(来自multiprocessing模块)而不是线程。

此外,列表中显示的SockThread位于IDLE内部。