21-Python多线程

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()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值