python中thread的用法

合集下载

pythonGUI库图形界面开发之PyQt5线程类QThread详细使用方法

pythonGUI库图形界面开发之PyQt5线程类QThread详细使用方法

pythonGUI库图形界⾯开发之PyQt5线程类QThread详细使⽤⽅法QThread是Qt的线程类中最核⼼的底层类。

由于PyQt的的跨平台特性,QThread要隐藏所有与平台相关的代码要使⽤的QThread开始⼀个线程,可以创建它的⼀个⼦类,然后覆盖其它QThread.run()函数class Thread(QThread):def __init __(self):super(Thread,self).__ init __()def run(self):#线程相关的代码pass接下来创建⼀个新的线程thread = Thread()thread.start()可以看出,PyQt的线程使⽤⾮常简单—-建⽴⼀个⾃定义的类(如thread),⾃我继承⾃QThread ,并实现其run()⽅法即可在使⽤线程时可以直接得到Thread实例,调⽤其start()函数即可启动线程,线程启动之后,会⾃动调⽤其实现的run()的函数,该⽅法就是线程的执⾏函数业务的线程任务就写在run()函数中,当run()退出之后线程就基本结束了,QThread有started和finished信号,可以为这两个信号指定槽函数,在线程启动和结束之时执⾏⼀段代码进⾏资源的初始化和释放操作,更灵活的使⽤⽅法是,在⾃定义的QThread实例中⾃定义信号,并将信号连接到指定的槽函数,当满⾜⼀定的业务条件时发射此信号QThread类中的常⽤⽅法⽅法描述start()启动线程wait()阻⽌线程,直到满⾜如下条件之⼀与此QThread对象关联的线程已完成执⾏(即从run返回时),如果线程完成执⾏,此函数返回True,如果线程尚未启动,也返回True等待时间的单位是毫秒,如果时间是ULONG_MAX(默认值·),则等待,永远不会超时(线程必须从run返回),如果等待超时,此函数将会返回Falsesleep()强制当前线程睡眠多少秒QThread类中的常⽤信号信号描述started在开始执⾏run函数之前,从相关线程发射此信号finished当程序完成业务逻辑时,从相关线程发射此信号QThread的使⽤⽅法实例import sysfrom PyQt5.QtWidgets import *from PyQt5.QtCore import *from PyQt5.QtGui import *class MainWidget(QWidget):def __init__(self, parent=None):super(MainWidget, self).__init__(parent)#设置标题self.setWindowTitle('QThread多线程例⼦')#实例化多线程对象self.thread = Worker()#实例化列表控件与按钮控件self.listFile = QListWidget()self.btnStart = QPushButton('开始')#把控件放置在栅格布局中layout = QGridLayout(self)layout.addWidget(self.listFile, 0, 0, 1, 2)layout.addWidget(self.btnStart, 1, 1)#信号与槽函数的连接self.btnStart.clicked.connect(self.slotStart)self.thread.sinOut.connect(self.slotAdd)def slotAdd(self, file_inf):#向列表控件中添加条⽬self.listFile.addItem(file_inf)def slotStart(self):#开始按钮不可点击,线程开始self.btnStart.setEnabled(False)self.thread.start()class Worker(QThread):sinOut = pyqtSignal(str)def __init__(self, parent=None):super(Worker, self).__init__(parent)#设置⼯作状态与初始num数值self.working = Trueself.num = 0def __del__(self):#线程状态改变与线程终⽌self.working = Falseself.wait()def run(self):while self.working == True:#获取⽂本file_str = 'File index{0}'.format(self.num)self.num += 1# 发射信号self.sinOut.emit(file_str)# 线程休眠2秒self.sleep(2)if __name__ == '__main__':app = QApplication(sys.argv)demo = MainWidget()demo.show()sys.exit(app.exec_())运⾏效果图如下代码分析在这个例⼦中,单击开始按钮,会在后台定时读取数据,并把返回的数据显⽰在界⾯中,⾸先使⽤以下代码进⾏布局,把列表控件和按钮控件放在栅格布局管理器中#实例化列表控件与按钮控件self.listFile = QListWidget()self.btnStart = QPushButton('开始')#把控件放置在栅格布局中layout = QGridLayout(self)layout.addWidget(self.listFile, 0, 0, 1, 2)layout.addWidget(self.btnStart, 1, 1)然后将按钮的clicked信号连接到槽函数,单击开始触发槽函数self.btnStart.clicked.connect(self.slotStart)def slotStart(self):#开始按钮不可点击,线程开始self.btnStart.setEnabled(False)self.thread.start()⽐较复杂的是线程的信号,将线程的sinOut信号连接到slotAdd()槽函数,SlotAdd()函数负责在列表控件中动态添加字符串条⽬self.thread.sinOut.connect(self.slotAdd)def slotAdd(self,file_inf):#向列表控件中添加条⽬self.listFile.addItem(file_inf)定义⼀个线程类,继承⾃QThread,当线程启动时,执⾏run()函数class Worker(QThread):sinOut = pyqtSignal(str)def __init__(self, parent=None):super(Worker, self).__init__(parent)#设置⼯作状态与初始num数值self.working = Trueself.num = 0def __del__(self):#线程状态改变与线程终⽌self.working = Falseself.wait()def run(self):while self.working == True:#获取⽂本file_str = 'File index{0}'.format(self.num)self.num += 1# 发射信号self.sinOut.emit(file_str)# 线程休眠2秒self.sleep(2)多线程失败案例import sysfrom PyQt5.QtWidgets import *from PyQt5.QtCore import *from PyQt5.QtGui import *global secsec=0def setTime():global secsec+=1#Led显⽰数字+1lcdNumber.display(sec)def work():#计时器每秒计数timer.start(1000)for i in range(200000000):passtimer.stop()if __name__ == '__main__':app=QApplication(sys.argv)top=QWidget()top.resize(300,120)#垂直布局layout=QVBoxLayout(top)#添加⼀个显⽰⾯板lcdNumber=QLCDNumber()layout.addWidget(lcdNumber)button=QPushButton('测试')layout.addWidget(button)timer=QTimer()#每次计时结束,触发setTimetimer.timeout.connect(setTime)button.clicked.connect(work)top.show()sys.exit(app.exec_())失败效果图如下长时间停留在此界⾯,知道多线程任务完成后,此界⾯才会动,当耗时程序⾮常⼤时,就会造成程序运⾏失败的假象,实际还是在后台运⾏的,只是没有显⽰在主窗⼝的界⾯上,当然⽤户体验也就⾮常差,那么如何解决这个问题呢,下⾯实例三进⾏解答分离UI主线程与⼯作线程实例import sysfrom PyQt5.QtCore import *from PyQt5.QtGui import *from PyQt5.QtWidgets import *global secsec = 0class WorkThread(QThread):#实例化⼀个信号对象trigger = pyqtSignal()def __int__(self):super(WorkThread, self).__init__()def run(self):#开始进⾏循环for i in range(2000000000):pass# 循环完毕后发出信号self.trigger.emit()def countTime():global secsec += 1# LED显⽰数字+1lcdNumber.display(sec)def work():# 计时器每秒计数timer.start(1000)# 计时开始workThread.start()# 当获得循环完毕的信号时,停⽌计数workThread.trigger.connect(timeStop)def timeStop():#定时器停⽌timer.stop()print("运⾏结束⽤时", lcdNumber.value())global secsec = 0if __name__ == "__main__":app = QApplication(sys.argv)top = QWidget()top.resize(300, 120)# 垂直布局类QVBoxLayoutlayout = QVBoxLayout(top)# 加显⽰屏,按钮到布局中lcdNumber = QLCDNumber()layout.addWidget(lcdNumber)button = QPushButton("测试")layout.addWidget(button)#实例化定时器与多线程类timer = QTimer()workThread = WorkThread()button.clicked.connect(work)# 每次计时结束,触发 countTimetimer.timeout.connect(countTime)top.show()sys.exit(app.exec_())运⾏效果,程序主界⾯的数值会每秒增加1,直到循环结束,这⾥就避免了主界⾯长时间不动的尴尬!QThread线程事件处理实例对于执⾏很耗时的程序来说,由于PyQt需要等待程序执⾏完毕才能进⾏下⼀步,这个过程表现在界⾯上就是卡顿,⽽如果需要执⾏这个耗时程序时不断的刷新界⾯。

threading的用法

threading的用法

Threading是Python标准库中的一个模块,用于多线程编程。

它提供了创建和管理线程的方法,使得程序可以同时执行多个任务。

使用Threading模块的基本步骤如下:
1. 导入Threading模块
```python
import threading
```
2. 定义一个函数,这个函数将作为线程的执行体
```python
def my_function():
# do something
```
3. 创建一个Thread对象,并将上一步定义的函数作为参数传递给Thread类的构造函数中
```python
my_thread = threading.Thread(target=my_function)
```
4. 启动线程,调用Thread对象的start方法
```python
my_thread.start()
```
5. 如果需要等待线程执行完毕,可以使用join方法阻塞主线程,直到子线程执行完毕
```python
my_thread.join()
```
除了基本的用法之外,Threading模块还提供了一些其他的功能,如设置线程优先级、获取线程ID等。

python创建线程的方法

python创建线程的方法

python创建线程的方法Python是一种高级编程语言,它具有简单易学、可读性强、可扩展性好等特点,因此在开发Web应用、数据分析、人工智能等领域得到了广泛应用。

在Python中,创建线程是一项常见的任务,本文将介绍Python创建线程的方法。

一、Python创建线程的方法Python创建线程有两种方法:使用threading模块和继承Thread类。

下面分别介绍这两种方法。

1.使用threading模块threading模块是Python标准库中的一个模块,它提供了创建线程的方法。

使用threading模块创建线程的步骤如下:(1)导入threading模块import threading(2)定义线程函数def thread_func():# 线程执行的代码(3)创建线程对象thread = threading.Thread(target=thread_func)(4)启动线程thread.start()2.继承Thread类继承Thread类是另一种创建线程的方法。

使用这种方法创建线程的步骤如下:(1)导入threading模块import threading(2)定义线程类class MyThread(threading.Thread):def __init__(self):threading.Thread.__init__(self)def run(self):# 线程执行的代码(3)创建线程对象thread = MyThread()(4)启动线程thread.start()二、Python线程的状态在Python中,线程有三种状态:就绪状态、运行状态和阻塞状态。

1.就绪状态当线程被创建后,它处于就绪状态。

就绪状态的线程已经准备好运行,但是还没有被调度执行。

2.运行状态当线程被调度执行后,它处于运行状态。

运行状态的线程正在执行它的代码。

3.阻塞状态当线程需要等待某些事件发生时,它会进入阻塞状态。

python threadpoolexecutor的使用

python threadpoolexecutor的使用

python threadpoolexecutor的使用标题:深入理解与使用Python的ThreadPoolExecutor在Python中,多线程是一种有效提升程序执行效率的方式,尤其在处理IO密集型任务时。

Python的concurrent.futures模块提供了一种高级接口,用于异步执行callable对象,其中包括ThreadPoolExecutor,它是用于管理线程池的工具。

本文将详细解析ThreadPoolExecutor的使用方法和原理。

一、ThreadPoolExecutor的基本概念ThreadPoolExecutor是Python并发编程中的一个重要组件,它是一个线程池执行器。

线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。

当线程完成任务后,它不会被销毁,而是回到线程池中等待下一次任务分配。

这种方式可以避免频繁地创建和销毁线程,从而提高系统的效率。

二、创建和使用ThreadPoolExecutor1. 导入所需模块首先,我们需要导入concurrent.futures模块,这是使用ThreadPoolExecutor的前提。

pythonfrom concurrent.futures import ThreadPoolExecutor2. 创建ThreadPoolExecutor实例创建ThreadPoolExecutor实例时,可以指定最大线程数。

如果不指定,默认值为CPU核心数。

pythonexecutor = ThreadPoolExecutor(max_workers=5)3. 提交任务使用submit()方法提交任务到线程池。

这个方法接受一个可调用对象(如函数)和其参数,返回一个Future对象。

pythonfuture = executor.submit(func, arg1, arg2)4. 获取结果通过Future对象的result()方法获取任务的返回结果。

python中threading开启关闭线程操作

python中threading开启关闭线程操作

python中threading开启关闭线程操作在python中启动和关闭线程:⾸先导⼊threadingimport threading然后定义⼀个⽅法def serial_read():......然后定义线程,target指向要执⾏的⽅法myThread = threading.Thread(target=serial_read)启动它myThread.start()⼆、停⽌线程不多说了直接上代码import inspectimport ctypesdef _async_raise(tid, exctype):"""raises the exception, performs cleanup if needed"""tid = ctypes.c_long(tid)if not inspect.isclass(exctype):exctype = type(exctype)res = ctypes.pythonapi.PyThreadState_SetAsyncExc(tid, ctypes.py_object(exctype))if res == 0:raise ValueError("invalid thread id")elif res != 1:# """if it returns a number greater than one, you're in trouble,# and you should call it again with exc=NULL to revert the effect"""ctypes.pythonapi.PyThreadState_SetAsyncExc(tid, None)raise SystemError("PyThreadState_SetAsyncExc failed")def stop_thread(thread):_async_raise(thread.ident, SystemExit)停⽌线程stop_thread(myThread)补充知识:python threading实现Thread的修改值,开始,运⾏,停⽌,并获得内部值下⾯的半模版代码在 win7+python3.63 运⾏通过并且实测可⾏,为了⼴⼤想要实现python的多线程停⽌的同学import threadingimport timeclass MyThread(threading.Thread):def __init__(self):threading.Thread.__init__(self)self.Flag=True #停⽌标志位self.Parm=0 #⽤来被外部访问的#⾃⾏添加参数def run(self):while(True):if(not self.Flag):breakelse:time.sleep(2)def setFlag(self,parm): #外部停⽌线程的操作函数self.Flag=parm #booleandef setParm(self,parm): #外部修改内部信息函数self.Parm=parmdef getParm(self): #外部获得内部信息函数return self.Parmif __name__=="__main__":testThread=MyThread()testThread.setDaemon(True) #设为保护线程,主进程结束会关闭线程testThread.getParm() #获得线程内部值testThread.setParm(1) #修改线程内部值testThread.start() #开始线程print(testThread.getParm()) #输出内部信息time.sleep(2) #主进程休眠 2 秒testThread.setFlag(False) #修改线程运⾏状态time.sleep(2) #2019.04.25 修改print(testThread.is_alive()) #查看线程运⾏状态于2018-08-24修正⼀次,修正为在继承thread.Thread时,没有对⽗类初始化旧:def __init__(self):self.Flag=True #停⽌标志位self.Parm=0 #⽤来被外部访问的#⾃⾏添加参数新:def __init__(self):threading.Thread.__init__(self)self.Flag=True #停⽌标志位self.Parm=0 #⽤来被外部访问的#⾃⾏添加参数于2019年4⽉25⽇进⾏第⼆次修正,发现设置flag值后仍为true输出的情况,原因是输出在修改完成前执⾏,睡眠后结果正常以上这篇python中threading开启关闭线程操作就是⼩编分享给⼤家的全部内容了,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。

Python的多线程(threading)与多进程(multiprocessing)

Python的多线程(threading)与多进程(multiprocessing)

Python的多线程(threading)与多进程(multiprocessing)进程:程序的⼀次执⾏(程序载⼊内存,系统分配资源运⾏)。

每个进程有⾃⼰的内存空间,数据栈等,进程之间可以进⾏通讯,但是不能共享信息。

线程:所有的线程运⾏在同⼀个进程中,共享相同的运⾏环境。

每个独⽴的线程有⼀个程序⼊⼝,顺序执⾏序列和程序的出⼝。

线程的运⾏可以被强占,中断或者暂时被挂起(睡眠),让其他的线程运⾏。

⼀个进程中的各个线程共享同⼀⽚数据空间。

多线程import threadingdef thread_job():print "this is added thread,number is {}".format(threading.current_thread())def main():added_thread = threading.Thread(target = thread_job) #添加线程added_thread.start() #执⾏添加的线程print threading.active_count() #当前已被激活的线程的数⽬print threading.enumerate() #激活的是哪些线程print threading.current_thread() #正在运⾏的是哪些线程if __name__ == "__main__":main()this is added thread,number is <Thread(Thread-6, started 6244)>6[<HistorySavingThread(IPythonHistorySavingThread, started 7588)>, <ParentPollerWindows(Thread-3, started daemon 3364)>, <Heartbeat(Thread-5, started daemon 3056)>, <_MainThread(MainThread, started 1528)>, <Thread(Thread-6, started <_MainThread(MainThread, started 1528)>#join 功能等到线程执⾏完之后再回到主线程中去import threadingimport timedef T1_job():print "T1 start\n"for i in range(10):time.sleep(0.1)print "T1 finish"def T2_job():print 'T2 start'print 'T2 finish'def main():thread1 = threading.Thread(target = T1_job) #添加线程thread2 = threading.Thread(target = T2_job)thread1.start() #执⾏添加的线程thread2.start()thread1.join()thread2.join()print 'all done\n'if __name__ == "__main__":main()T1 startT2 startT2 finishT1 finishall done#queue 多线程各个线程的运算的值放到⼀个队列中,到主线程的时候再拿出来,以此来代替#return的功能,因为在线程是不能返回⼀个值的import timeimport threadingfrom Queue import Queuedef job(l,q):q.put([i**2 for i in l])def multithreading(data):q = Queue()threads = []for i in xrange(4):t = threading.Thread(target = job,args = (data[i],q))t.start()threads.append(t)for thread in threads:thread.join()results = []for _ in range(4):results.append(q.get())print resultsif __name__ == "__main__":data = [[1,2,3],[4,5,6],[3,4,3],[5,5,5]]multithreading(data)[[1, 4, 9], [16, 25, 36], [9, 16, 9], [25, 25, 25]]#多线程的锁import threadingimport timedef T1_job():global A,locklock.acquire()for i in xrange(10):A += 1print 'T1_job',Alock.release()def T2_job():global A,locklock.acquire()for i in xrange(10):A += 10print 'T2_job',Aif __name__ == "__main__":lock = threading.Lock()A = 0 #全局变量thread1 = threading.Thread(target = T1_job) #添加线程thread2 = threading.Thread(target = T2_job)thread1.start() #执⾏添加的线程thread2.start()thread1.join()thread2.join() 全局解释器锁GIL(Global Interpreter Lock)GIL并不是Python的特性,他是CPython引⼊的概念,是⼀个全局排他锁。

thread 写法

thread 写法

thread 写法一、基本概念Thread 是编程中的一个重要概念,指的是程序中的执行线程。

在多线程编程中,多个任务可以同时执行,从而提高程序的运行效率。

在 Java、C#、Python 等编程语言中,都有对线程的支持。

二、Thread 的创建创建 Thread 的方式因编程语言而异。

以 Java 和 C# 为例,介绍两种常见的创建方式。

1. Java 中创建 Thread 的方式:* 继承 Thread 类:需要重写 run() 方法,在该方法中编写线程要执行的代码。

* 实现 Runnable 接口:将实现该接口的对象作为参数传递给 Thread 对象,然后调用 Thread 对象的 start() 方法启动线程。

2. C# 中创建 Thread 的方式:* 使用 Thread 类:需要创建 Thread 对象,并调用其 Start() 方法启动线程。

在 Start() 方法内部,需要调用委托(Delegate)来指定线程要执行的代码。

无论是哪种方式,都需要在创建线程后调用 start() 方法启动线程,并在需要的时候调用 Thread 对象或委托的 Join() 方法等待线程执行完毕。

三、线程的同步和互斥在多线程编程中,为了保证数据的一致性和正确性,通常需要进行线程同步和互斥。

常见的同步机制包括锁(Lock)和信号量(Semaphore)等。

在使用这些机制时,需要注意避免死锁和竞态条件等问题。

四、线程的优先级和调度大多数编程语言都支持线程的优先级和调度。

通过设置线程的优先级,可以控制线程的执行顺序。

不同的编程语言有不同的调度机制,需要根据具体语言文档进行了解和设置。

五、常见问题及解决方案在多线程编程中,常见的问题包括竞态条件、死锁、线程泄露等。

针对这些问题,需要采取相应的解决方案,如使用锁的粒度控制、合理分配资源、避免长时间占用资源等。

六、线程的应用场景线程在多任务环境下具有很高的应用价值,可以大大提高程序的运行效率。

python中start类用法

python中start类用法

python中start类用法在Python中,start类指的是线程类Thread的start方法。

Thread类是Python 中内置的一个线程模块,用于创建和管理线程。

在Python中,线程是一种执行流的最小单位,可以与其他线程并发执行。

使用线程可以将多个任务同时执行,从而提高程序的运行效率。

start方法是Thread类的一个实例方法,用于启动一个新的线程,并使其开始执行指定的函数或方法。

start方法的语法结构如下:pythonthread.start()其中,thread是一个Thread类的实例对象。

现在让我们来详细了解一下start方法的用法及其原理。

1. 创建Thread类的实例对象在使用start方法之前,需要先创建一个Thread类的实例对象。

可以通过继承Thread类,并重写其run方法来创建自定义的线程类。

以下是一个简单的示例代码:pythonimport threading# 自定义线程类class MyThread(threading.Thread):def run(self):# 线程具体执行的代码print("Hello, World!")# 创建线程对象my_thread = MyThread()2. 定义线程执行的函数或方法在创建线程对象后,需要定义具体线程要执行的函数或方法。

这个函数或方法可以是普通函数、类方法或静态方法。

以下是一个示例代码:pythonimport threadingdef my_func():# 线程具体执行的代码print("Hello, World!")# 创建线程对象my_thread = threading.Thread(target=my_func)3. 启动线程当线程对象和其执行的函数或方法都准备好后,可以通过调用start方法来启动线程。

以下是一个示例代码:pythonmy_thread.start()注意,不能直接调用执行函数或方法,因为执行函数或方法不会以线程的方式运行,不具备并发执行的特性。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

python中thread的用法
Python中的thread用于实现多线程编程。

多线程可以提高程序的执行效率,同时也可以方便地进行并发编程。

Python中的thread模块提供了Thread类,可以通过继承该类来创建线程。

使用thread模块创建线程的基本步骤如下:
1. 导入thread模块。

2. 创建一个Thread对象,同时传入一个可调用对象(比如函数或方法)作为参数。

3. 调用Thread对象的start()方法,启动线程。

例如:
import thread
import time
# 定义一个函数作为线程的执行体
def print_time(threadName, delay):
count = 0
while count < 5:
time.sleep(delay)
count += 1
print('%s: %s' % (threadName, time.ctime(time.time()))) # 创建两个线程
try:
thread.start_new_thread(print_time, ('Thread-1', 2,)) thread.start_new_thread(print_time, ('Thread-2', 4,)) except:
print('Error: unable to start thread')
# 等待所有线程执行完毕
while 1:
pass
上述代码中,我们定义了一个print_time()函数作为线程的执行体,该函数会打印出当前时间并等待一段时间。

然后我们通过thread.start_new_thread()函数创建了两个线程,并启动它们。

最后我们使用一个无限循环等待所有线程执行完毕。

除了使用thread模块创建线程之外,Python中还可以使用threading模块来实现多线程编程。

threading模块提供了更高级别的线程操作接口,使用起来更加方便。

总之,Python中的thread和threading模块为我们提供了方便的多线程编程工具。

我们可以利用多线程来提高程序的执行效率,同时也可以避免因为阻塞而导致的程序卡死等问题。

相关文档
最新文档