python基础篇 -- day19

23 篇文章 0 订阅
21 篇文章 1 订阅

协程

协程: 微线程

'''
 greenlet
 gevent
'''
from greenlet import greenlet

def eat():
    for i in range(5):
        print('坤坤喜欢吃肉饼...')
        g2.switch()
def listen_music():
    for i in range(5):
        print('坤坤喜欢听麻婆豆腐..', i)
        g1.switch()
if __name__ == '__main__':
    g1 = greenlet(eat)
    g2 = greenlet(listen_music)
    g1.switch()
'''
gevent:
  猴子补丁

'''
import time
import gevent
from gevent import monkey

monkey.patch_all() # 加载猴子补丁,必须加

def eat():
    for i in range(5):
        print('坤坤喜欢吃肉饼...')
        time.sleep(0.1)

def listen_music():
    for i in range(5):
        print('坤坤喜欢听麻婆豆腐..', i)
        time.sleep(0.1)

if __name__ == '__main__':
    g1 = gevent.spawn(eat)
    g2 = gevent.spawn(listen_music)

    g1.join()
    g2.join()

    print('----over---')

线程间通信:

生产者与消费者:
生产者: 线程
消费者: 线程

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


def producer(queue):
    print('{}开门啦!'.format(current_thread().name))
    foods = ['红烧狮子头', '香肠烤饭', '蒜蓉生蚝', '酸辣土豆丝', '肉饼']
    for i in range(1, 21):
        food = random.choice(foods)
        print('{}正在加工中.....'.format(food))
        time.sleep(1)
        print('加工完成可以上菜了...')
        queue.put(food)
    queue.put(None)


def consumer(queue):
    print('{}来吃饭啦'.format(current_thread().name))
    while True:
        food = queue.get()
        if food:
            print('正在享用美食:', food)
            time.sleep(0.5)
        else:
            print('{}把饭店吃光啦,走人...'.format(current_thread().name))
            break


if __name__ == '__main__':
    queue = Queue(8)
    t1 = Thread(target=producer, name='老家肉饼', args=(queue,))
    t2 = Thread(target=consumer, name='坤坤', args=(queue,))

    t1.start()
    t2.start()

线程的信号量

count 5
信号量的实现方式:
在内部有一个counter计数器,每当我们 s.acquire()一次,计数器就进行减1处理
每当 s.release()一次,计数器就进行加1处理,当计数器为0的时候其他线程的就处于
等待的状态counter的值就是同一时间可以开启线程的个数
建议使用with

import time
from threading import Thread, Semaphore, current_thread


# from multiprocessing import Semaphore,Process

def task(s):
    # s.acquire()  # 减1
    with s:
        for i in range(5):
            print('{}扫地....{}'.format(current_thread().name, i))
            time.sleep(1)
    # s.release()  # 加1


if __name__ == '__main__':
    s = Semaphore(4)
    for i in range(10):
        t = Thread(target=task, args=(s,))
        t.start()

网络编程:

  • 网络各层
    端口号: 理解成端口号 识别应用
    查看端口的使用: netstat -an
    IP地址: 电脑在互联网的标识
    32位
    8 8 8 8
    1111 1111 —》255
    A类: 1.0.0.0 ~ 127.255.255.255
    B类: 128.0.0.0 ~191.255.255.255
    C类: 192.0.0.0 ~ 232.255.255.255

模型

socket

socket(简称 套接字) 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:
它能实现不同电脑间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的;
例如我们每天浏览网页、QQ 聊天、收发 email 等等

tcp:
SOCK_STREAM --》TCP
SOCK_DGRAM --》UDP
客户端:

from socket import socket, AF_INET, SOCK_STREAM

# 表示创建了一个客户端的socket
client = socket(AF_INET, SOCK_STREAM)

con_address = ('10.0.102.94', 9001)

# 告诉客户端要连接的服务器的地址和端口号
client.connect(con_address)
while True:
    msg = input('客户端输入:')
    client.send(msg.encode('utf-8'))
    if msg == 'byebye':
        break

    # 接收服务器端的msg
    recv_msg = client.recv(512).decode('utf-8')
    print('服务器回话:', recv_msg)
    if recv_msg == 'byebye':
        break

client.close()

服务端:

from socket import socket, AF_INET, SOCK_STREAM

# 创建socket 对象
server = socket(AF_INET, SOCK_STREAM)
# 绑定端口号
server.bind(('', 9001))

# 开启监听状态
server.listen(5)

while True:
    sock, addr_info = server.accept()  # 阻塞的
    while True:
        data = sock.recv(1024).decode('utf-8')
        print('客户端说:{}'.format(data))
        if data == 'byebye':
            break
        msg = input('服务器输入:')
        sock.send(msg.encode('utf-8'))
        if msg == 'byebye':
            break

    sock.close()
    print(addr_info, '离开了!')

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只敲代码的大脸猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值