首页 > 系统相关 >python - 进程与线程 -2

python - 进程与线程 -2

时间:2023-05-28 14:55:55浏览次数:40  
标签:__ Thread python self print 线程 进程 import

1. 线程

一个进程可以包含多个线程,一条线程就是进程中一个单一顺序的控制流。一个进程中可以并发多个线程,每条线程执行不同的任务。

1.1 使用Thread创建线程

import threading
import time


def task():
    for i in range(3):
        time.sleep(1)
        print(f"线程名:{threading.current_thread().name}")


if __name__ == "__main__":
    print("主线程开始")
    # 创建线程对象,放到ts中
    ts = []
    for i in range(5):
        p = threading.Thread(target=task)
        ts.append(p)
    # 启动线程
    for i in ts:
        i.start()
    # 等待
    for i in ts:
        i.join()
    print("主线程结束")

Thread(group=None, target=None, name=None,
                 args=(), kwargs=None, *, daemon=None)
  • group 保留
  • target 表示一个可调用对象,经程启动时,run方法会调用此对象。
  • name 线程名
  • args, kwargs是传递给target函数的参数

:: 方法和Process类基本一样。

1.2 使用Thread子类创建线程

继承Thread类,重写run方法即可。

import threading
import time


class SubThread(threading.Thread):
    # 重写
    def run(self):
        for i in range(3):
            time.sleep(1)
            print(f"线程名:{threading.current_thread().name}")


if __name__ == "__main__":
    print("主线程开始")
    # 创建线程对象,放到ts中
    ts = []
    for i in range(5):
        p = SubThread()
        ts.append(p)
    # 启动线程
    for i in ts:
        i.start()
    # 等待
    for i in ts:
        i.join()
    print("主线程结束")

2. 线程之间通信

和进程不同,多个线程可以访问进程中定义的全局变量。即在一个进程中的所有线程共享全局变量。

2.1 互斥锁

由于多个线程共享全局变量,在同一时刻都可以修改它,造成混乱。

互斥锁:防止多个线程同时读取某一块内存区域。互斥锁为资源引入一个状态:锁定和非锁定。某个线程要修改共享数据时,先将其锁定,此时资源的状态为锁定,其它线程不能更改。该线程用完释放资源,将资源状态变成非锁定,其它线程才可以锁定资源进行修改。

互斥锁保证了每次只有一个线程可以进行写入操作,保证数据的正确性。


import time
from multiprocessing import Lock
from threading import Thread

# 100张票
n = 100


def task():
    global n
    # 上锁
    lock.acquire()
    n -= 1
    time.sleep(0.1)
    print(f"购票成功,还剩下{n}张")
    # 解锁
    lock.release()


if __name__ == '__main__':
    # 创建一把锁
    lock = Lock()
    cache = []
    # 创建20个线程来买票
    for i in range(20):
        t = Thread(target=task)
        t.start()

    for i in cache:
        i.join()

如果不上锁就混乱了,sleep之后,n的结果全是80,因为那个时间段n的值已经是80了。

在使用互斥锁时,要避免死锁。一般有多个锁时会造成死锁,甲等乙放锁,乙等甲放锁,都不放卡住了。

2.2 用队列在线程间通信

与队列在进程间通信一样,但用的Queue是queue模块的,而不是multiprocessing模块中的Queue

import random
import time
from queue import Queue
from threading import Thread


class Producer(Thread):
    def __init__(self, q):
        Thread.__init__(self)
        self.q = q

    def run(self):
        for i in range(5):
            print(f"生产了{i}")
            self.q.put(i)
            time.sleep(random.random())
        print("下班")


class Consumer(Thread):
    def __init__(self, q):
        Thread.__init__(self)
        self.q = q

    def run(self):
        for i in range(5):
            v = self.q.get()
            print(f"消费了{i}")
            self.q.put(i)
            time.sleep(random.random())


if __name__ == '__main__':
    q = Queue()
    p1 = Producer(q)
    p2 = Consumer(q)
    p1.start()
    p2.start()

标签:__,Thread,python,self,print,线程,进程,import
From: https://www.cnblogs.com/three-sheep/p/17438264.html

相关文章

  • Python+Requests零基础系统掌握接口自动化测试
    Python+Requests零基础系统掌握接口自动化测试download:3wzxit666com设计高性能的售票系统在当今数字化时代,一个高性能的售票系统对于任何企业或机构来说都是至关重要的。无论该系统服务于电影院、剧院、运输公司还是其他类型的场所,它必须始终可靠、快速和易于使用。以下是几个要......
  • python -- 解决连接sqlserver出现的“ pymssql._pymssql.OperationalError: (20009, b
     因为工作关系,近期需要用python连接sqlserver处理一些数据问题。由于笔记本上的软件是新安装的,所以有些配置避免不了重新设置,期间遇到一些小问题,记录一下。 下面正式开始写一段代码,测试sqlserver数据库连接importpymssql#写法1#conn=pymssql.connect(host='localho......
  • python3-int
    1、介绍builtins.py文件中定义了int类,用于处理python中整数数据。int也是python的基本数据类型之一。2、类和初始化classint(object):def__init__(self,x,base=10):3、初始化(1)字面量初始化支持十进制、二进制、八进制和十六进制#十进制#a=15#a1=-15#......
  • python3-bool
    1、介绍builtins.py文件中定义了bool类,用于处理python中逻辑真和假。bool也是python的基本数据类型之一。2、类和初始化classbool(int):def__init__(self,x):pass3、初始化(1)字面量初始化可选值为True和False,注意大小写敏感a=Truea1=Falseprint......
  • python3-float
    1、介绍builtins.py文件中定义了float类,用于处理python中浮点数数据。float也是python的基本数据类型之一。2、类和初始化classfloat(object):def__init__(self,*args,**kwargs):pass3、初始化(1)字面量初始化支持十进制和科学计数法#十进制赋值a=3......
  • python3-str补充
    1、转义与反转义转义字符的机制是为了表示某些无法编辑输入或者与python编程语言冲突的字符而存在。其特征是前缀字符\。有时候,不想使用转义机制,可以在字符串前面使用r前缀,字符串将按照本身的字符输出。a='abc\"'#输出:abc"b=r'abc\"'#输出:abc\"转义字符描述......
  • python3-str
    1、介绍builtins.py文件中定义了str类,用于处理python中字符和字符串数据。str也是python的基本数据类型之一。2、类classstr(object):def__init__(self,value='',encoding=None,errors='strict'):"""str(object='')->str......
  • python3-complex
    1、介绍builtins.py文件中定义了complex类,用于处理python中复数数据。complex也是python的基本数据类型之一。2、类classcomplex(object):def__init__(self,*args,**kwargs):pass3、字面量初始化字面量赋值,complex由两部分组成,实部和虚部。实部可以是整......
  • python - 进程与线程 -1
    多任务就是操作系统能同时执行多个程序,比如:看电影,聊天,查看网页。进程(process)是计算机中已经运行程序的实体,一个任务就是一个进程。1.使用multiprocessing模块创建进程1.1用Process类创建进程在这个模块中有一个Process类代表一个进程对象:Process(group=None,target=None,......
  • 【python基础】基本数据类型-字符串类型
    1.初识字符串字符串就是一系列字符。在python中,用引号括起来文本内容的都是字符串。其语法格式为:‘文本内容’或者“文本内容”我们发现其中的引号可以是单引号,也可以是双引号。这样的灵活性可以使我们进行引号之间的嵌套。编写程序如下所示:运行结果如下所示我们可以发现......