美文网首页
Python 多线程

Python 多线程

作者: Fizz翊 | 来源:发表于2018-08-08 17:13 被阅读27次

多线程

1.耗时操作

1.1耗时操作放到主线程中的问题:

耗时操作放到主线程中,会阻塞线程

多个耗时操作都放到一个线程中执行,最终执行的时间是两个耗时操作的时间和。

1.2怎么解决问题

使用多个线程

2.多线程技术

python内置的threading模块,可以支持多线程

所有的进程默认都有一个线程,一般叫这个线程为主线程,其他的线程叫子线程,如果想要在进程中添加其他的线程,就创建线程对象

def download(file,times):
    print('开始下载',file)
    time.sleep(times)
    print(file,'下载结束')
if __name__ == '__main__':
    #1.创建线程对象
    # target:需要在子线程中执行的函数的名字  args:调用函数的实参列表(参数类型是列表)  返回值:线程对象
    t1 = threading.Thread(target=download,args=['爱情公寓',10])
    #2.在子线程中执行任务
    t1.start()
    t2 = threading.Thread(target=download,args=['爱情公寓1',5])
    t2.start()
    # download('爱情公寓')
    # download('狄仁杰')
    print('===')

结果为:

开始下载 爱情公寓
开始下载 爱情公寓1
===
爱情公寓1 下载结束
爱情公寓 下载结束

3.多线程技术2

方式2:写一个自己的线程类
a 写一个类,继承自Thread类
b 重写run方法,在里面规定需要在子线程中执行的任务
c 在子线程中执行的任务对应的功能,如果需要参数,通过类的对象属性来传值

from threading import Thread
from requests import request
import re
#下载数据
class DownloadThread(Thread):
    '''下载类'''
    def __init__(self,file):
        super().__init__()
        self.filepath = file
    def run(self):
        '''run方法 '''
        '''
        1.写在这个方法的内容就在子线程中执行的内容
        2.这个方法不要直接调用
        '''
        print('开始下载')
        response = request('GET',self.filepath)
        data = response.content

        #获取文件后缀
        suffix = re.search(r'\.\w+$',self.filepath).group()
        with open ('abcd'+suffix,'wb') as f:
            f.write(data)
        print('下载完成...')
if __name__ == '__main__':
    print('====')
    t1 = DownloadThread('http://yuting.local/shareX/Git.exe')
    # 通过start间接调用run方法,run方法中的任务在子线程中执行
    t1.start()
    # 直接调用run方法,run方法中的任务在当前线程中执行
    # t1.run()
    t2 = DownloadThread('https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1533720058151&di=766b5c97653351e805c85881ecaa57d0&imgtype=0&src=http%3A%2F%2Fx.itunes123.com%2Fuploadfiles%2Fb2ab55461e6dc7a82895c7425fc89017.jpg')
    t2.start()
    print('!!!!')

4.多线程应用

import socket
from threading import Thread


class CoversationThread(Thread):
    """在子线程中处理不同的客户端会话"""
    """
    python中可以在函数参数的后面加一个冒号,来对参数的类型进行说明
    """
    def __init__(self, conversation:socket.socket, address):
        super().__init__()
        self.conversation = conversation
        self.address = address

    def run(self):
        while True:
            self.conversation.send('你好!'.encode())
            print(self.address,self.conversation.recv(1024).decode(encoding='utf-8'))



if __name__ == '__main__':

    server = socket.socket()
    server.bind(('10.7.181.117', 8080))
    server.listen(512)

    while True:

        conversation, address = server.accept()
        t = CoversationThread(conversation, address)
        t.start()
        # while True:
        #     conversation.send('你好!'.encode())
        #     print(conversation.recv(1024).decode(encoding='utf-8'))

import socket

if __name__ == '__main__':
    client = socket.socket()
    client.connect(('10.7.181.117', 8080))
    while True:
        print(client.recv(1024).decode(encoding='utf-8'))
        message = input('>>>')
        client.send(message.encode())


相关文章

  • 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/drpxbftx.html