当前位置: 首页 > news >正文

Python程序中的线程操作-创建多线程

目录

  • 一、python线程模块的选择
  • 二、threading模块
  • 三、通过threading.Thread类创建线程
    • 3.1 创建线程的方式一
    • 3.2 创建线程的方式二
  • 四、多线程与多进程
    • 4.1 pid的比较
    • 4.2 开启效率的较量
    • 4.3 内存数据的共享问题
  • 五、Thread类的其他方法
    • 5.1 代码示例
    • 5.2 join方法
  • 六、多线程实现socket
    • 6.1 服务端
    • 6.2 客户端

一、python线程模块的选择

Python提供了几个用于多线程编程的模块,包括thread、threading和Queue等。thread和threading模块允许程序员创建和管理线程。thread模块提供了基本的线程和锁的支持,threading提供了更高级别、功能更强的线程管理的功能。Queue模块允许用户创建一个可以用于多个线程之间共享数据的队列数据结构。

避免使用thread模块,因为更高级别的threading模块更为先进,对线程的支持更为完善,而且使用thread模块里的属性有可能会与threading出现冲突;其次低级别的thread模块的同步原语很少(实际上只有一个),而threading模块则有很多;再者,thread模块中当主线程结束时,所有的线程都会被强制结束掉,没有警告也不会有正常的清除工作,至少threading模块能确保重要的子线程退出后进程才退出。

thread模块不支持守护线程,当主线程退出时,所有的子线程不论它们是否还在工作,都会被强行退出。而threading模块支持守护线程,守护线程一般是一个等待客户请求的服务器,如果没有客户提出请求它就在那等着,如果设定一个线程为守护线程,就表示这个线程是不重要的,在进程退出的时候,不用等待这个线程退出。

二、threading模块

multiprocess模块的完全模仿了threading模块的接口,二者在使用层面,有很大的相似性,因而不再详细介绍(官方链接)

三、通过threading.Thread类创建线程

3.1 创建线程的方式一

from threading import Thread
import time
def sayhi(name):
    time.sleep(2)
    print('%s say hello' %name)

if __name__ == '__main__':
    t=Thread(target=sayhi,args=('nick',))
    t.start()
    print('主线程')

3.2 创建线程的方式二

from threading import Thread
import time
class Sayhi(Thread):
    def __init__(self,name):
        super().__init__()
        self.name=name
    def run(self):
        time.sleep(2)
        print('%s say hello' % self.name)


if __name__ == '__main__':
    t = Sayhi('nick')
    t.start()
    print('主线程')

四、多线程与多进程

4.1 pid的比较

from threading import Thread
from multiprocessing import Process
import os

def work():
    print('hello',os.getpid())

if __name__ == '__main__':
    # part1:在主进程下开启多个线程,每个线程都跟主进程的pid一样
    t1=Thread(target=work)
    t2=Thread(target=work)
    t1.start()
    t2.start()
    print('主线程/主进程pid',os.getpid())

    # part2:开多个进程,每个进程都有不同的pid
    p1=Process(target=work)
    p2=Process(target=work)
    p1.start()
    p2.start()
    print('主线程/主进程pid',os.getpid())

4.2 开启效率的较量

from threading import Thread
from multiprocessing import Process
import os

def work():
    print('hello')

if __name__ == '__main__':
    # 在主进程下开启线程
    t=Thread(target=work)
    t.start()
    print('主线程/主进程')
    '''
    打印结果:
    hello
    主线程/主进程
    '''

    # 在主进程下开启子进程
    t=Process(target=work)
    t.start()
    print('主线程/主进程')
    '''
    打印结果:
    主线程/主进程
    hello
    '''

4.3 内存数据的共享问题

from  threading import Thread
from multiprocessing import Process
import os
def work():
    global n
    n=0

if __name__ == '__main__':
    # n=100
    # p=Process(target=work)
    # p.start()
    # p.join()
    # print('主',n) # 毫无疑问子进程p已经将自己的全局的n改成了0,但改的仅仅是它自己的,查看父进程的n仍然为100


    n=1
    t=Thread(target=work)
    t.start()
    t.join()
    print('主',n) # 查看结果为0,因为同一进程内的线程之间共享进程内的数据

五、Thread类的其他方法

Thread实例对象的方法:

  • isAlive():返回线程是否活动的。
  • getName():返回线程名。
  • setName():设置线程名。

threading模块提供的一些方法:

  • threading.currentThread():返回当前的线程变量。
  • threading.enumerate():返回一个包含正在运行的线程的list。正在运行指线程启动后、结束前,不包括启动前和终止后的线程。
  • threading.activeCount():返回正在运行的线程数量,与len(threading.enumerate())有相同的结果。

5.1 代码示例

from threading import Thread
import threading
from multiprocessing import Process
import os

def work():
    import time
    time.sleep(3)
    print(threading.current_thread().getName())


if __name__ == '__main__':
    # 在主进程下开启线程
    t=Thread(target=work)
    t.start()

    print(threading.current_thread().getName())
    print(threading.current_thread()) # 主线程
    print(threading.enumerate()) # 连同主线程在内有两个运行的线程
    print(threading.active_count())
    print('主线程/主进程')

    '''
    打印结果:
    MainThread
    <_MainThread(MainThread, started 140735268892672)>
    [<_MainThread(MainThread, started 140735268892672)>, <Thread(Thread-1, started 123145307557888)>]
    主线程/主进程
    Thread-1
    '''

5.2 join方法

from threading import Thread
import time
def sayhi(name):
    time.sleep(2)
    print('%s say hello' %name)

if __name__ == '__main__':
    t=Thread(target=sayhi,args=('nick',))
    t.start()
    t.join()
    print('主线程')
    print(t.is_alive())
    '''
    nick say hello
    主线程
    False
    '''

六、多线程实现socket

6.1 服务端

import multiprocessing
import threading

import socket
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.bind(('127.0.0.1',8080))
s.listen(5)

def action(conn):
    while True:
        data=conn.recv(1024)
        print(data)
        conn.send(data.upper())

if __name__ == '__main__':

    while True:
        conn,addr=s.accept()


        p=threading.Thread(target=action,args=(conn,))
        p.start()

6.2 客户端

import socket

s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(('127.0.0.1',8080))

while True:
    msg=input('>>: ').strip()
    if not msg:continue

    s.send(msg.encode('utf-8'))
    data=s.recv(1024)
    print(data)

转载于:https://www.cnblogs.com/nickchen121/p/11141748.html

相关文章:

  • 实现线程安全的方法是
  • 我的灵魂永不下跪:临刑前的最后一课
  • 将字符串转换为JSON对象
  • 代码的未来
  • 简单的shell脚本备份数据库和代码
  • 海量日志数据提取某日访问百度次数最多的那个IP的Java实现
  • 与一个在深圳的外国软件工程师的对话
  • Gridview自定义分页
  • C语言学习趣事_关于C语言中的输入输出流
  • ios7下不能录音问题解决
  • iCloud的真正目的:置Windows于死地
  • json数据与字符串的相互转化
  • 服务器跟不上,网站打开慢,服务器自动重启,怎么办?
  • 盒子游戏(湖南省第七届大学生计算机程序设计竞赛)
  • cout设置16进制大写输出
  • 【译】理解JavaScript:new 关键字
  • 30秒的PHP代码片段(1)数组 - Array
  • co.js - 让异步代码同步化
  • crontab执行失败的多种原因
  • es6(二):字符串的扩展
  • Linux Process Manage
  • mockjs让前端开发独立于后端
  • MYSQL如何对数据进行自动化升级--以如果某数据表存在并且某字段不存在时则执行更新操作为例...
  • React组件设计模式(一)
  • Spring框架之我见(三)——IOC、AOP
  • 安装python包到指定虚拟环境
  • 案例分享〡三拾众筹持续交付开发流程支撑创新业务
  • 百度地图API标注+时间轴组件
  • 类orAPI - 收藏集 - 掘金
  • 前端js -- this指向总结。
  • 使用putty远程连接linux
  • 为什么要用IPython/Jupyter?
  • 问题之ssh中Host key verification failed的解决
  • 一个6年java程序员的工作感悟,写给还在迷茫的你
  • 在electron中实现跨域请求,无需更改服务器端设置
  • 7行Python代码的人脸识别
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • 数据可视化之下发图实践
  • "无招胜有招"nbsp;史上最全的互…
  • #[Composer学习笔记]Part1:安装composer并通过composer创建一个项目
  • $forceUpdate()函数
  • (2)MFC+openGL单文档框架glFrame
  • (26)4.7 字符函数和字符串函数
  • (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作...
  • (pojstep1.1.2)2654(直叙式模拟)
  • (pt可视化)利用torch的make_grid进行张量可视化
  • (附源码)springboot 个人网页的网站 毕业设计031623
  • (附源码)ssm考生评分系统 毕业设计 071114
  • (附源码)计算机毕业设计SSM基于健身房管理系统
  • (企业 / 公司项目)前端使用pingyin-pro将汉字转成拼音
  • (十八)SpringBoot之发送QQ邮件
  • (顺序)容器的好伴侣 --- 容器适配器
  • (转)Java socket中关闭IO流后,发生什么事?(以关闭输出流为例) .
  • (转)shell中括号的特殊用法 linux if多条件判断
  • (转载)利用webkit抓取动态网页和链接