当我使用以下代码时使用单线程时间是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
答案 0 :(得分:1)
由于Global Interpreter Lock,你的主题在一个核心上互相争斗。全局解释器锁可以防止多个python线程一次运行,即使在多核系统上也是如此。因此,要并行执行多个cpu绑定任务,必须使用进程(来自multiprocessing
模块)而不是线程。
此外,列表中显示的SockThread
位于IDLE
内部。