python线程学习

线程的概念

线程是CPU调度的基本单元,线程运行于进程当中,一个进程中可以运行很多个线程。同一进程中的所有线程共享内存空间

threading
	Thread                   # 表示一个线程的执行的对象
		start()              # 开始线程的执行
		run()                # 定义线程的功能的函数(一般会被子类重写)
		join(timeout=None)   # 允许主线程等待线程结束,程序挂起,直到线程结束;如果给了timeout,则最多等待timeout秒.
		getName()            # 返回线程的名字
		setName(name)        # 设置线程的名字
		isAlive()            # 布尔标志,表示这个线程是否还在运行中
		isDaemon()           # 返回线程的daemon标志
		setDaemon(daemonic)  # 后台线程,把线程的daemon标志设置为daemonic(一定要在调用start()函数前调用)
		# 默认主线程在退出时会等待所有子线程的结束。如果希望主线程不等待子线程,而是在退出时自动结束所有的子线程,就需要设置子线程为后台线程(daemon)
	Lock              # 锁原语对象
	Rlock             # 可重入锁对象.使单线程可以在此获得已获得了的锁(递归锁定)
	Condition         # 条件变量对象能让一个线程停下来,等待其他线程满足了某个条件.如状态改变或值的改变
	Event             # 通用的条件变量.多个线程可以等待某个事件的发生,在事件发生后,所有的线程都会被激活
	Semaphore         # 为等待锁的线程提供一个类似等候室的结构
	BoundedSemaphore  # 与Semaphore类似,只是不允许超过初始值
	Time              # 与Thread相似,只是他要等待一段时间后才开始运行
	activeCount()     # 当前活动的线程对象的数量
	currentThread()   # 返回当前线程对象
	enumerate()       # 返回当前活动线程的列表
	settrace(func)    # 为所有线程设置一个跟踪函数
	setprofile(func)  # 为所有线程设置一个profile函数

python中多线程

import os
import time
from random import randint
from threading import Thread


def download(name):
    print("name:{} download task pid :{}, parent pid:P{}".format(name, os.getpid(), os.getppid()))
    download_time = randint(5, 10)
    time.sleep(download_time)
    print("download task finished cost_time:{}".format(download_time))


if __name__ == '__main__':
    start = time.time()
    print("current python_thread pid is:%d" % os.getpid())
    thread_list = []
    for i in range(10):
        t = Thread(target=download, args=(i,))
        t.start()
        # t.run()
        thread_list.append(t)

    for j in thread_list:
        j.join()

    end = time.time()
    print("total cost_time:%.3f" % (end - start))

自定义线程

import time
from random import randint
from threading import Thread


class MyThread(Thread):
    def __init__(self, name):
        super(MyThread, self).__init__()
        self._filename = name

    def run(self):
        print("MyThread start run %s" % self._filename)
        download_time = randint(5, 10)
        time.sleep(download_time)
        print("%s download finished time:%d" % (self._filename, download_time))


if __name__ == '__main__':
    start = time.time()
    thread_list = []
    for i in range(10):
        t = MyThread(str(i))
        t.start()
        thread_list.append(t)

    for j in thread_list:
        j.join()

    end = time.time()
    print("total cost time %.3f" % (end - start))

线程锁机制

from time import sleep
from threading import Thread, Lock


class Account(object):

    def __init__(self):
        self._balance = 0
        self._lock = Lock()

    def deposit(self, money):
        self._lock.acquire()
        try:
            # 计算存款后的余额
            new_balance = self._balance + money
            # 模拟受理存款业务需要0.01秒的时间
            sleep(0.01)
            # 修改账户余额
            self._balance = new_balance
        finally:
            self._lock.release()

    @property
    def balance(self):
        return self._balance


class AddMoneyThread(Thread):

    def __init__(self, account, money):
        super().__init__()
        self._account = account
        self._money = money

    def run(self):
        self._account.deposit(self._money)


def main():
    account = Account()
    threads = []
    # 创建100个存款的线程向同一个账户中存钱
    for _ in range(100):
        t = AddMoneyThread(account, 1)
        t.start()
        threads.append(t)
    # 等所有存款的线程都执行完毕
    for t in threads:
        t.join()
    print('账户余额为: ¥%d元' % account.balance)


if __name__ == '__main__':
    main()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python多线程是一种并发编程技术,可以同时执行多个线程,以提高程序的运行效率。在Python中,可以使用`threading`模块来实现多线程。 下面是一个简单的Python多线程示例: ```python import threading def worker(): print("Worker is running") # 创建线程对象 thread1 = threading.Thread(target=worker) thread2 = threading.Thread(target=worker) # 启动线程 thread1.start() thread2.start() # 等待所有线程结束 thread1.join() thread2.join() ``` 在上面的示例中,我们定义了一个`worker`函数,它会在控制台输出一条消息。然后我们创建了两个线程对象,并使用`start()`方法启动它们。最后,我们使用`join()`方法等待所有线程结束。 需要注意的是,多线程Python中并不一定能够实现真正的并行执行,因为Python的GIL(全局解释器锁)机制限制了多线程的执行效率。这意味着即使在多个线程中同时执行相同的代码,也只有一个线程可以获得CPU资源进行执行。但是,Python多线程对于某些特定的任务仍然是非常有用的,例如I/O密集型任务或者使用多核CPU的系统。 在Python学习多线程时,需要了解以下几点: 1. 线程的创建和启动:需要使用`Thread`类来创建线程对象,并使用`start()`方法来启动线程。 2. 线程的同步:由于GIL机制的存在,Python多线程并不能实现真正的并行执行。因此,需要使用锁、条件变量等机制来保证线程之间的同步和通信。 3. 线程池:可以使用线程池来管理多个线程,以提高程序的运行效率。Python中的`queue`模块提供了线程安全的队列,可以用于实现线程池。 4. 多进程:如果需要更高效的并发编程,可以使用Python的多进程模块`multiprocessing`。它可以更好地利用多核CPU的优势,并避免GIL的影响。 5. 锁的使用:在使用多线程时,需要使用锁来保证线程之间的同步和通信。需要注意避免死锁和竞争条件等问题。 6. 死锁问题:死锁是线程之间相互等待资源导致的问题,可以通过适当的调度策略和使用锁来避免死锁问题的发生。 7. 多线程的优点和缺点:多线程适用于I/O密集型任务和需要并发执行的任务。但是,它也存在一些缺点,如性能开销、资源竞争等问题。需要根据具体的应用场景来选择是否使用多线程。 总之,Python多线程是一种重要的并发编程技术,可以用于提高程序的运行效率。在学习Python多线程时,需要了解其基本原理和常见问题,并根据具体的应用场景来选择是否使用多线程
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值