美文网首页
python 多线程

python 多线程

作者: y_7539 | 来源:发表于2018-12-09 11:33 被阅读0次

多线程编程

Thread方式

# 导包
import threading
import time


# 创建方法
def work(msg):
    print(f"当前线程:{threading.current_thread().name}", msg)
    time.sleep(1)


# 创建对象
for i in range(10):
    t = threading.Thread(target=work, args=(i,))
    t.start()

Thread类继承

import threading


# 创建一个类继承线程
class NewThread(threading.Thread):
    def __init__(self, name):
        # 调用父类的init方法
        super(NewThread, self).__init__()
        self.name = name


    # run方法必须写
    def run(self):
        print(f"{self.name}好吃")


for i in ["包子", "牛肉", "鸡肉"]:
    # 实例化对象
    t = NewThread(i)
    t.start()

线程和进程

线程:调度单元具体做事的那个人 共享内存空间 修改全局变量会影响 线程不安全 需要互斥锁

进程:程序的代码,其他的一些资源 每增加一个进程就会创建一份内存空间 修改全局变量不会有影响 通信麻烦 需要用队列

线程共享内存空间

import threading

num = 1


def write():
    global num
    num += 1
    print(f"write里面的{num}")


def read():
    global num
    num += 1
    print(f"read里面的{num}")


# 实例化
tw = threading.Thread(target=write)
tr = threading.Thread(target=read)
tw.start()
tr.start()
print("main里面的", num)

线程安全

import threading

num = 0


def write():
    global num
    for i in range(100000):
        num += 1
    print(f"write里面的{num}")


def read():
    global num
    for i in range(100000):
        num += 1
    print(f"read里面的{num}")


# 实例化
tw = threading.Thread(target=write)
tr = threading.Thread(target=read)
tw.start()
#tw.join()
tr.start()
#tr.join()
print("main里面的", num)

结果不等于200000

个人看法:进程的join方法,线程里面同样有,这样出来的结果就是200000

解决线程安全加互斥锁

某个线程要更改共享数据时,先将其锁定,此时资源的状态为”锁定“,其他线程不能更改;直到该线程释放资源,将资源的状态变成”非锁定“,其他线程才能再次锁定该资源。互斥锁保证了多线程下数据的正确性

import threading

num = 0


def write():
    global num
    #加锁
    l.acquire()
    for i in range(100000):
        num += 1
    #解锁
    l.release()
    print(f"write里面的{num}")


def read():
    global num
    #加锁
    l.acquire()
    for i in range(100000):
        num += 1
    #解锁
    l.release()
    print(f"read里面的{num}")
#创建一把锁
l = threading.Lock()

# 实例化
tw = threading.Thread(target=write)
tr = threading.Thread(target=read)
tw.start()
tr.start()

死锁

#coding=utf-8
import threading
import time

class MyThread1(threading.Thread):
    def run(self):
        if mutexA.acquire():
            print(self.name+'----do1---up----')
            time.sleep(1)

            if mutexB.acquire():
            #if mutexB.acquire(timeout=2):
                print(self.name+'----do1---down----')
                mutexB.release()
            mutexA.release()

class MyThread2(threading.Thread):
    def run(self):
        if mutexB.acquire():
            print(self.name+'----do2---up----')
            time.sleep(1)
            if mutexA.acquire():
                print(self.name+'----do2---down----')
                mutexA.release()
            mutexB.release()

mutexA = threading.Lock()
mutexB = threading.Lock()

if __name__ == '__main__':
    t1 = MyThread1()
    t2 = MyThread2()
    t1.start()
    t2.start()

解决:添加超时时间

进程与线程

进程:独立内存空间,资源分配的单元

线程:共享内存空间 大大减少内存的使用 线程不安全 调试单元 最后做事的那个人

一个程序至少一个进程,至少一个线程

什么时候使用多进程,什么时候使用多线程

IO密集型:多线程(输入 输出 多用于数据传输)

CPU密集型:多进程(多用来做运算)

相关文章

  • GIL

    谈谈python的GIL、多线程、多进程 最近在看 Python 的多线程,经常我们会听到老手说:“python下...

  • Python多线程编程——多线程编程中的加锁机制

    如果大家对Python中的多线程编程不是很了解,推荐大家阅读之前的两篇文章:Python多线程编程——多线程基础介...

  • 5-线程(补充)

    Python多线程原理与实战 目的: (1)了解python线程执行原理 (2)掌握多线程编程与线程同步 (3)了...

  • Python_提高

    GIL全局解释器锁 描述Python GIL的概念, 以及它对python多线程的影响?编写⼀个 多线程抓取⽹⻚的...

  • Python程序员都知道的入门知识の八

    目录【Python程序员都知道的入门知识】 1. 多线程threading、Queue Python的多线程由th...

  • Python多线程实现生产者消费者

    1. Python多线程介绍 Python提供了两个有关多线程的标准库,thread和threading。thre...

  • 多线程

    Python多线程原理与实战 目的: (1)了解python线程执行原理 (2)掌握多线程编程与线程同步 (3)了...

  • Python多线程(上)

    前言 说起Python的多线程,很多人都嗤之以鼻,说Python的多线程是假的多线程,没有用,或者说不好用,那本次...

  • Python 3中的多线程

    Python 3的多线程 Python 3的多线程模块threading在旧版_thread模块基础上进行了更高层...

  • Python 多线程抓取图片效率实验

    Python 多线程抓取图片效率实验 实验目的: 是学习python 多线程的工作原理,及通过抓取400张图片这种...

网友评论

      本文标题:python 多线程

      本文链接:https://www.haomeiwen.com/subject/wwmhhqtx.html