Python第四章学习心得

本文探讨了Python中的进程和线程概念,强调了使用多进程和多线程的原因,如提高执行效率和改善用户体验。同时,提到了多线程可能引发的资源竞争问题,并举例说明了多线程在下载图片和模拟银行汇款操作中的应用。此外,还简要介绍了计算机网络和网络编程的基础知识,包括TCP聊天服务器的创建。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

进程

进程是操作系统分配内存的基本单位,进程之间的单位是相互隔离的

进程之间的交换数据要IPC机制

点我返回目录

线程

一个进程又可以进一步划分成多个线程,线程是进程的执行单元,也是操作系统分配CPU的基本单元。

点我返回目录

为什么要使用多进程和多线程

多线程

为了得到更多的CPU调度。

多进程

好处

1、把一个耗时间的任务,分解为多个进程或者多个线程一起操作。提升执行效率,缩短程序的执行时间。
2、使用多线程可以改善用户体验。

多进程程序对其他程序是不友好的

点我返回目录

# 钩子函数(hook)/回调函数
def run(self):
    download(self._filename)

这种函数知道什么时候用,不知道什么时候触发。

  • 当多个线程同时访问一个资源的时候,就有可能因为竞争资源导致状态错误
  • 被多个线程访问的资源我们通常称之为临界资源,对临界资源的访问需要加上保护

    点我返回目录
  • 用多线程下载图片
from threading import Thread
import requests
import json


class DownloadTask(Thread):

    def __init__(self, url):
        super().__init__()
        self._url = url

    def run(self):
        resp = requests.get(self._url)
        filename = self._url[self._url.rfind('/') + 1:]
        try:
            with open(filename,'wb') as fs:
                fs.write(resp.content)
        except IOError as e:
            print(e)


def main():
    # request / response
    resp = requests.get('http://api.tianapi.com/meinv/?key=34d7ac914cfb754622b1a1cba8f80aff&num=10')
    mydict = json.loads(resp.text)
    threads = []
    for tempdict in mydict['newslist']:
        pic_url = tempdict['picUrl']
        thread = DownloadTask(pic_url)
        thread.start()
        threads.append(thread)
        for thread in threads:
            thread.join()
        print('图片下载完成!')


if __name__ == '__main__':
    main()
  • 多线程模拟银行汇款操作
import time
from threading import Thread, Lock


class Account(object):

    def __init__(self):
        self._balance = 0
        self._lock = Lock()

    @property
    def balance(self):
        return self._balance

    def deposit(self, money):
        if money > 0:
            self._lock.acquire()
            try:
                new_balance = self._balance + money
                time.sleep(0.01)
                self._balance = new_balance
            finally:
                self._lock.release()


class AddMoneyThread(Thread):

    def __init__(self, account):
        super().__init__()
        self._account = account

    def run(self):
        self._account.deposit(1)


def main():
    start = time.time()
    account = Account()
    tlist = []
    for _ in range(100):
        t = AddMoneyThread(account)
        tlist.append(t)
        t.start()
    for t in tlist:
        t.join()
    print('账户余额:%d元' % account.balance)
    end = time.time()
    print('总共消耗%f秒' % (end-start))


if __name__ == '__main__':
    main()

点我返回目录

计算机网络

多台独立自主的计算机,放在一起,形成一个系统,叫计算机网络

点我返回目录

网络编程

创建一个基于TCP一些的聊天服务器

from socket import socket
from threading import Thread

# TCP - Transfer Control Protocol
# UDP - User Datagram Protocol


def main():

    class RefreshScreenThread(Thread):

        def __init__(self, client):
            super().__init__()
            self._client = client

        def run(self):
            while running:
                data = self._client.recv(1024)
                print(data.decode('utf-8'))

    nickname = input('请输入你的昵称:')
    myclient = socket()
    myclient.connect(('10.7.189.118', 12345))
    running = True
    RefreshScreenThread(myclient).start()
    while running:
        content = input('请发言:')
        if content == 'byebye':
            myclient.send(content.encode('utf-8'))
            running = False
        else:
            msg = nickname + ':' + content
            myclient.send(msg.encode('utf-8'))


if __name__ == '__main__':
    main()

创建基于聊天服务器的客户端,可以多人连接上去对话

from socket import socket
from threading import Thread


def main():
    class ClientHandler(Thread):

        def __init__(self, client):
            super().__init__()
            self._client = client

        def run(self):
            while True:
                try:
                    data = self._client.recv(1024)
                    if data.decode('utf-8') == 'byebye':
                        client.remove(self._client)
                        self._client.close()
                        break
                    else:
                        for client in clients:
                            client.send(data)
                except Exception as e:
                    print(e)
                    client.remove(self._client)
                    break

    server = socket()
    server.bind(('10.7.189.63', 9999))
    server.listen(512)
    clients = []
    while True:
        curr_client, addr = server.accept()
        print(addr[0],'进入聊天室')
        clients.append(curr_client)
        ClientHandler(curr_client).start()


if __name__ == '__main__':
    main()

点我返回目录

名词科普
名词科普英文全称内容解释
HTTPHyper Text Transfer Protocol超文本传输协议
SMTPSimple Mail Transfer Protocol简单邮件传输协议
POP3Post Offce Protocol version3邮局协议
IMAPInternet Mail Access Protocol交互邮件访问协议
TelnetTCP/IP协议Internet远程登陆服务的标准协议和主要方式
FTPFile Transfer Protocol文件传输协议,中文简称为“文传协议”
TCP/IPTransmission Control Protocol/Internet Protocol传输控制协议/因特网互联协议
netstat -na查看网络活动链接
telnet加入IP地址和端口连接ip地址
碎片单词记忆块
单词翻译
process进程
thread线程
mult
subprocess子进程
marine海,海平面的
submarine潜水艇
subprocess.call调用
socket插座

点我返回目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值