20-多线程

1.Server服务器

from socket import socket

server = socket()
server.bind(('10.7.184.61', 8081))
server.listen(125)
while True:
    print('等待连接.....')

    connect, address = server.accept()

    # 发图片(1)和发文字     (2), 给别人发消息   (3),IP和端口:
    message = '1:发送图片; 2:发送文字'
    connect.send(message.encode(encoding='utf-8'))

    # 接受客户端的选择
    re_message = connect.recv(1024).decode(encoding='utf-8')
    if re_message == '1':
        with open('files/0.jpg', 'rb') as f:
            data = f.read()

        print(len(data))
        # 发送图片长度
        connect.send(str(len(data)).encode('utf-8'))
        # 发送图片内容
        connect.send(data)
    elif re_message == '2':
        message = input('>>>')
        connect.send(message.encode(encoding='utf-8'))
    else:
        pass

2.Client客户端

from socket import socket

client = socket()
client.connect(('10.7.184.61', 8081))

# 接受消息
re_message = client.recv(1024).decode(encoding='utf-8')
print(re_message)

# 选择
send_message = input('>>>')
client.send(send_message.encode(encoding='utf-8'))

if send_message == '1':
    # 接受图片长度
    length = (client.recv(1024)).decode(encoding='utf-8')
    # print(length)
    # 接收图片
    count = 0
    while True:
        re_data = client.recv(1024)
        count += len(re_data)
        print(count)
        with open('client/re.jpg', 'ab') as f:
            f.write(re_data)

        if count == int(length):
            break
elif send_message == '2':
    re_message = client.recv(1024).decode(encoding='utf-8')
    print(re_message)

3.多线程

Thread类的对象就是线程对象

主线程:

每一个进程默认都有一个线程,这个线程叫主线程。默认情况下,所有的代码都是在主线程中运行的
主线程以外的线程都叫子线程

from threading import Thread
from datetime import datetime
import time

def download(name):
    print(f'《{name}》开始下载:{datetime.now()}')
    time.sleep(5)
    print(f'《{name}》下载结束:{datetime.now()}')


# 情况一:让三个电影在一个线程中下载
# download('V字仇杀队')
# download('当幸福来敲门')
# download('摔跤吧爸爸')

# 情况二:
# Thread(target=需要在当前创建的线程中执行的功能, args=target对应的函数在调用的时候需要传的参数)
t1 = Thread(target=download, args=('V字仇杀队',))
t2 = Thread(target=download, args=('当幸福来敲门',))
t3 = Thread(target=download, args=('摔跤吧爸爸',))

# 让子线程去执行线程中的任务
t1.start()     # download('V字仇杀队')

t2.start()
t3.start()
# download('摔跤吧爸爸')


films = ['电影1', '电影2', '电影3']
ts = []
for f in films:
    t = Thread(target=download, args=(f,))
    ts.append(t)
    # t.start()

for t in ts:
    print(t)

4.多线程2

from threading import Thread, current_thread
from datetime import datetime
import time

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

    def run(self):
        print('下载'+self.name)
        print(current_thread())
        print('run中的代码')


# print(current_thread())

t1 = DownloadThread('电影1')
print('====:', t1.name)
t1.start()    # 自动在子线程中执行run方法中的代码
"""
class Thread:
    def run(self):
        pass
    def start(self):
        self.run()

5.线程安全

import time
from threading import Thread, Lock

money = 1000
lock = Lock()


def get_money(num):
    global money
    lock.acquire()    # 加锁
    m1 = money
    # print('取钱余额', m1)
    time.sleep(5)
    m1 -= num
    money = m1
    print('取钱剩下:', m1)
    lock.release()     # 解锁


def set_money(num):
    global money
    lock.acquire()
    m1 = money
    # print('存钱余额:', m1)
    time.sleep(5)
    m1 += num
    money = m1
    print('存钱剩下:', m1)
    lock.release()


t1 = Thread(target=get_money, args=(500,))
t2 = Thread(target=set_money, args=(1000,))

t2.start()
t1.start()
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.下面代码执行结果 执行结果 - 会卡死 分析如下图 分析:同步执行 + 主队列会卡死当前线程,dispatch...
    zysmoon阅读 379评论 0 0
  • 简介 一个必不可少的知识,时间久了,一位小伙伴遇到疑问时,我竟然解答混淆了,当然重写温习一下,不管是新知识也好,基...
    a437e8f87a81阅读 1,223评论 0 3
  • 一. 操作系统概念 操作系统位于底层硬件与应用软件之间的一层.工作方式: 向下管理硬件,向上提供接口.操作系统进行...
    月亮是我踢弯得阅读 6,005评论 3 28
  • 前言回顾 1.正则语法 匹配符号: .(匹配除了\n以外的任意字符)\w\d\s\W\D\S[字符集]、[字符1-...
    不语sun阅读 450评论 0 0
  • 黑色的海岛上悬着一轮又大又圆的明月,毫不嫌弃地把温柔的月色照在这寸草不生的小岛上。一个少年白衣白发,悠闲自如地倚坐...
    小水Vivian阅读 3,133评论 1 5