西安建设城市信息网站,wordpress列表缩略图,中国十大上市装修公司,lnmp wordpress 404目录 
一、python多线程 
1.1 多线程的作用 
1.2 python中的 threading 模块 
1.3 线程锁 
二、python网络编程 
2.1 通过socket访问网络 
2.2 python2.x中的编码问题 
2.3 python3的编码问题 一、python多线程 
1.1 多线程的作用 
多线程技术在计算机编程中扮演着重要的角色它主要有以下几个作用 1. **提高程序的响应性**在单线程程序中如果某个操作需要较长时间比如读取大文件或进行复杂计算整个程序会在这段时间内无法响应用户的其他操作。而多线程允许程序在执行耗时操作的同时其他线程可以继续响应用户输入从而提高程序的响应速度和用户体验。 2. **提高资源利用率**现代计算机通常有多个处理器或核心。多线程允许程序同时运行在多个处理器上从而更充分地利用系统资源提高处理速度和效率。 3. **简化程序结构**通过将复杂的任务分解为多个并行的线程可以使程序的逻辑更加清晰和模块化。每个线程负责一部分任务便于管理和维护。 4. **实现并发操作**在某些应用场景中需要同时进行多个独立的任务如服务器处理多个客户端请求、图形界面同时响应用户输入和后台数据处理等。多线程使得这些并发操作成为可能。 5. **提高执行效率**对于可以并行执行的任务多线程可以显著减少总的执行时间。例如在数据处理、图像渲染、科学计算等领域多线程可以大幅提升处理速度。 然而多线程编程也带来了一些挑战如线程同步问题、死锁风险、资源竞争等需要开发者仔细设计和实现以确保程序的正确性和稳定性。 
1.2 python中的 threading 模块 Python中用于多线程编程的内置模块是 threading。下面我将详细解释如何使用 threading 模块来启动多线程。 
### 使用 threading 模块启动多线程 
1. **导入 threading 模块** 
import threading 
2. **定义线程函数**    这个函数将作为新线程的入口点。 def my_thread_function(arg1, arg2):# 线程执行的代码print(fThread is running with arguments: {arg1}, {arg2}) 
3. **创建 Thread 对象**    在创建 Thread 对象时可以传入线程函数和参数。 
thread  threading.Thread(targetmy_thread_function, args(hello, world)) 
4. **启动线程**    调用 start() 方法启动线程。 
thread.start() 
5. **等待线程完成可选**    如果需要等待线程执行完毕可以调用 join() 方法。 
thread.join() 
### 完整示例 
以下是一个完整的示例展示了如何使用 threading 模块创建和启动多个线程 
import threadingdef my_thread_function(arg1, arg2):print(fThread {threading.current_thread().name} is running with arguments: {arg1}, {arg2})# 创建多个线程
threads  []
for i in range(5):thread  threading.Thread(targetmy_thread_function, args(fhello_{i}, fworld_{i}))threads.append(thread)thread.start()# 等待所有线程完成
for thread in threads:thread.join()print(All threads have finished.) 在这个示例中我们创建了5个线程每个线程执行 my_thread_function 函数并传递不同的参数。最后我们使用 join() 方法确保主线程等待所有子线程完成后再继续执行。 通过这种方式您可以利用 threading 模块在Python中实现多线程编程从而提高程序的并发性和响应性。 
1.3 线程锁 在多线程编程中所有线程共享代码和数据资源。这种共享性带来了一个主要风险多个线程可能同时访问和修改同一个变量导致不可预期的结果。为了解决这一问题大多数编程语言提供了锁机制来确保线程安全。 
### 问题代码示例 
import threadingg_Num  0def threadProc():global g_Numfor i in range(1000000):g_Num  g_Num  1  # 修改数据thread1  threading.Thread(namehello1, targetthreadProc)
thread2  threading.Thread(namehello2, targetthreadProc)
thread1.start()
thread2.start()
thread1.join()
thread2.join()print(g_Num) 在这个示例中两个线程同时对 g_Num 进行递增操作导致最终打印出来的数字不可预期。 
### 使用锁机制解决问题 为了确保线程安全可以使用锁来保护对 g_Num 的访问。以下是修正后的代码   
import threadinglock  threading.Lock()
g_Num  0def threadProc():global g_Numfor i in range(1000000):lock.acquire()  # 获取锁g_Num  g_Num  1  # 修改数据lock.release()  # 释放锁thread1  threading.Thread(namehello1, targetthreadProc)
thread2  threading.Thread(namehello2, targetthreadProc)
thread1.start()
thread2.start()
thread1.join()
thread2.join()print(g_Num) 通过使用锁我们确保在任何时刻只有一个线程能够进入锁定范围并修改 g_Num从而避免了竞态条件确保最终结果的可预期性。 二、python网络编程 
2.1 通过socket访问网络 
Python 提供了两种不同层次的网络服务接口 1. **低级网络服务**这一层支持基本的 Socket 功能它实现了标准的 BSD Sockets API允许开发者访问底层操作系统 Socket 接口的所有方法从而进行更底层的网络操作。 2. **高级网络服务**这一层包含模块 SocketServer它提供了一系列服务器中心类旨在简化网络服务器的开发过程使得开发者能够更快速地构建网络应用。 
**什么是 Socket** Socket又称为“套接字”是应用程序用于网络通信的一种抽象。通过 Socket应用程序可以发送请求或响应网络请求实现不同主机间或同一台计算机上不同进程间的通信。Socket 是网络编程的基础它封装了复杂的网络通信细节使得开发者能够更容易地编写网络应用程序。 
socket()函数 
Python 中我们用 socket函数来创建套接字语法格式如下 
socket.socket([family[, type[, proto]]]) 
参数 
family: 套接字家族可以使 AF_UNIX 或者 AF_INET。type: 套接字类型可以根据是面向连接的还是非连接分为 SOCK_STREAM 或 SOCK_DGRAM。protocol: 一般不填默认为 0。 
Socket 对象(内建)方法 简单示例如下 
服务端代码 
# 导入 socket 模块
import socketdef main():print(~~~~~服务端启动~~~~~)# 1. 创建 socketsSock  socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 2. 绑定sSock.bind((192.168.1.125, 1234))  # IP地址 可用本地IP测试: 127.0.0.1# 3. 监听sSock.listen(5)# 4. 处理连接cSock, addr  sSock.accept()print(客户端连接成功)cSock.send(str(欢迎:).encode(utf-8))# 5、6 发送、接收数据while True:print(cSock.recv(1024).decode(utf-8))inStr  input(: )if inStr  quit:breakcSock.send(str(inStr).encode(utf-8))# 7. 关闭套接字cSock.close()sSock.close()if __name__  __main__:main() 
客户端代码 
# 导入 socket 模块
import socketdef main():print(~~~~~客户端启动~~~~~)# 1. 创建 socketcSock  socket.socket()# 2. 连接服务器host  192.168.1.125  # IP地址 可用本地IP测试: 127.0.0.1port  1234  # 设置端口号cSock.connect((host, port))# 3、4 发送、接收数据while True:print(cSock.recv(1024).decode(utf-8))inStr  input(: )if inStr  quit:breakcSock.send(str(inStr).encode(utf-8))# 5. 关闭套接字cSock.close()if __name__  __main__:main() 
2.2 python2.x中的编码问题 在Python 2.x版本中存在两个主要的字符串类unicode 和 str它们都继承自 basestring。 str 类是带编码的默认情况下使用 ASCII 编码。因此如果你的程序中包含中文字符串默认情况下会报错。可以通过设置Python 2中的字符默认编码来解决这个问题。 # coding:utf-8   # 默认使用UTF-8编码# coding:gbk     # 默认使用GBK编码 unicode 类是不带编码的用于表示已知文明中的任何一个字符。需要注意的是unicode 并不是一种编码方式。  示例 ul  u中国  # 字符串 unicode类型print ul      # 输出: u\u4e2d\u56fdprint len(ul) # 输出: 2u2  uhelloprint u2      # 输出: uhelloprint len(u2) # 输出: 5sl  中国   # str 类型字节串print sl      # 输出: \xd6\xd0\xb9\xfa中文 GBK 编码控制台不指定中文默认 GBKprint len(sl) # 输出: 4s2  helloprint s2      # 输出: helloprint len(s2) # 输出: 5 
在Python 2中可以在字符串和字节串之间进行转换 - encode将字符串按指定方式进行编码转换成字节流str存放在内存中。 - decode将字节流按指定方式进行解码转换成字符串unicode用于显示。 
可以使用 chardet 模块来判断字节流的编码 
import chardet
raw  u12AB好
print chardet.detect(raw.encode(utf-8))  # 输出: {encoding: utf-8, confidence: 0.99}
print chardet.detect(raw.encode(gbk))    # 输出: {encoding: GB2312, confidence: 0.99} 在C中多字节集通常是GBK编码而宽字节集是UTF-16编码。字符使用哪种方式进行编码就应该使用哪种方式进行解码。以下是几种常见情况1. C端发送过来的是GBK编码我们需要显示那么应该使用 decode(GBK) 转换成 unicode 便于显示。2. C端发送过来的是UTF-16编码我们需要显示那么应该使用 decode(UTF-16) 转换成 unicode 便于显示。3. C端发送过来的数据需要Python端转发到其他C端不需要转换。4. Python端要直接给C端发送字符串那么应该根据C端使用多字节集还是宽字节集使用 encode(GBK) 或者 encode(UTF-16) 之后再发送给C端。5. 如果你直接使用字节串那么应该先使用 decode(UTF-8) 转换成 unicode再使用 encode(GBK) 或者 encode(UTF-16) 再发送给C端。 
示例代码 
c端代码 
#include iostream
#include winsock2.h
#include ws2tcpip.h#pragma comment(lib, ws2_32.lib)// 数据包 1024  4  4  1032
struct NETMSGINFO {int MSGTYPE;       // 消息类型int nMsgLen;       // 消息大小char szMsgBuff[1024]; // 消息内容
};int main() {// 1. 初始化环境WSADATA wsd  {};if (WSAStartup(MAKEWORD(2, 2), wsd) ! 0) {std::cerr  WSAStartup failed!  std::endl;return 1;}// 2. 创建套接字SOCKET sock  socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if (sock  INVALID_SOCKET) {std::cerr  socket creation failed!  std::endl;WSACleanup();return 1;}// 3. 连接sockaddr_in addr  {};addr.sin_family  AF_INET;addr.sin_port  htons(0x1234);addr.sin_addr.s_addr  inet_addr(127.0.0.1);if (connect(sock, (sockaddr*)addr, sizeof(addr))  SOCKET_ERROR) {std::cerr  connect failed!  std::endl;closesocket(sock);WSACleanup();return 1;}// 4. 发送数据NETMSGINFO netbuf  {};netbuf.MSGTYPE  1; // 可以用宏代替上线strcpy_s(netbuf.szMsgBuff, 1024, xxx:上线了);netbuf.nMsgLen  strlen(netbuf.szMsgBuff); // 字符长度注意Python中字符不以0结尾if (send(sock, (char*)netbuf, sizeof(netbuf), 0)  SOCKET_ERROR) {std::cerr  send failed!  std::endl;closesocket(sock);WSACleanup();return 1;}// 5. 接收数据if (recv(sock, (char*)netbuf, sizeof(netbuf), 0)  SOCKET_ERROR) {std::cerr  recv failed!  std::endl;closesocket(sock);WSACleanup();return 1;}std::cout  netbuf.szMsgBuff  std::endl;// 6. 清理环境closesocket(sock);WSACleanup();return 0;
} 
python端代码 
import socket
import structdef main():# 创建TCP套接字sock  socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 绑定端口sock.bind((127.0.0.1, 0x1234))# 监听sock.listen(socket.SOMAXCONN)# 等待连接clientsock, addr  sock.accept()print(fConnection from {addr})# 获取消息大小是发送数据结构大小Msg  clientsock.recv(1032)# 进行格式拆包由于字符长度不确定暂时不解包消息msgtype, nMsgLen  struct.unpack(ii, Msg[0:8])# 第二次根据长度解包指定解包字符长度使用切片方式msgbuff,  struct.unpack(f{nMsgLen}s, Msg[8:8nMsgLen])# 字符需要进行解码因为VS中默认是以GBK编码方式print(msgbuff.decode(gbk))# 回复客户端消息构建一个数据包# 这个数据需要进行GBK编码否则VS中解析不了字符sendbug  你好\n.encode(gbk)# 打包数据msg  struct.pack(ii1024s, 0, len(sendbug), sendbug)# 发送数据clientsock.send(msg)# 关闭套接字clientsock.close()sock.close()if __name__  __main__:main() 
2.3 python3的编码问题 在Python 3中默认使用UTF-8编码并且明确区分了文本字符和二进制数据分别用str和bytes类型表示。 
s1  abc  # str类型字符串
s2  babc  # bytes类型二进制字节流
s1  中国  # str类型字符串
s2  b中国  # bytes类型不支持非ASCII字符这样会报错 在Python 2中str类型在Python 3中对应bytes类型表现为字节转换是通过encode方法用于存储。 在Python 2中Unicode类型在Python 3中对应str类型表现为字符转换是通过decode方法用于显示。 
encode和decode方法用于在str和bytes之间进行转换。 
示例 
s  18CM好棒
print(s.encode())  # 默认使用UTF-8编码
# 输出: b18CM\xe5\xa5\xbd\xe6\xa3\x92
print(s.encode(gbk))  # 使用GBK编码
# 输出: b18CM\xba\xc3\xb0\xb2print(b18CM\xe5\xa5\xbd\xe6\xa3\x92.decode())  # 默认使用UTF-8解码
# 输出: 18CM好棒
print(b18CM\xba\xc3\xb0\xb2.decode(gbk))  # 使用GBK解码
# 输出: 18CM好棒 
需要注意的是encode和decode方法的默认参数都是UTF-8。 
 文章转载自: http://www.morning.jcwrb.cn.gov.cn.jcwrb.cn http://www.morning.tgqzp.cn.gov.cn.tgqzp.cn http://www.morning.dglszn.com.gov.cn.dglszn.com http://www.morning.kpgms.cn.gov.cn.kpgms.cn http://www.morning.ckbmz.cn.gov.cn.ckbmz.cn http://www.morning.rqlqd.cn.gov.cn.rqlqd.cn http://www.morning.lpcct.cn.gov.cn.lpcct.cn http://www.morning.cmfkp.cn.gov.cn.cmfkp.cn http://www.morning.wfwqr.cn.gov.cn.wfwqr.cn http://www.morning.c7501.cn.gov.cn.c7501.cn http://www.morning.gagapp.cn.gov.cn.gagapp.cn http://www.morning.jbmbj.cn.gov.cn.jbmbj.cn http://www.morning.pcrzf.cn.gov.cn.pcrzf.cn http://www.morning.rgksz.cn.gov.cn.rgksz.cn http://www.morning.qclmz.cn.gov.cn.qclmz.cn http://www.morning.yrwqz.cn.gov.cn.yrwqz.cn http://www.morning.nbwyk.cn.gov.cn.nbwyk.cn http://www.morning.wsyst.cn.gov.cn.wsyst.cn http://www.morning.tnthd.cn.gov.cn.tnthd.cn http://www.morning.rydhq.cn.gov.cn.rydhq.cn http://www.morning.srckl.cn.gov.cn.srckl.cn http://www.morning.tygn.cn.gov.cn.tygn.cn http://www.morning.xjqrn.cn.gov.cn.xjqrn.cn http://www.morning.bpmtg.cn.gov.cn.bpmtg.cn http://www.morning.hytr.cn.gov.cn.hytr.cn http://www.morning.ctpfq.cn.gov.cn.ctpfq.cn http://www.morning.rfxg.cn.gov.cn.rfxg.cn http://www.morning.bwgrd.cn.gov.cn.bwgrd.cn http://www.morning.mntxalcb.com.gov.cn.mntxalcb.com http://www.morning.hxmqb.cn.gov.cn.hxmqb.cn http://www.morning.frtt.cn.gov.cn.frtt.cn http://www.morning.kxqwg.cn.gov.cn.kxqwg.cn http://www.morning.wphzr.cn.gov.cn.wphzr.cn http://www.morning.pwfwk.cn.gov.cn.pwfwk.cn http://www.morning.hnk25076he.cn.gov.cn.hnk25076he.cn http://www.morning.nktxr.cn.gov.cn.nktxr.cn http://www.morning.wttzp.cn.gov.cn.wttzp.cn http://www.morning.xqcgb.cn.gov.cn.xqcgb.cn http://www.morning.gpryk.cn.gov.cn.gpryk.cn http://www.morning.rwmp.cn.gov.cn.rwmp.cn http://www.morning.nqmdc.cn.gov.cn.nqmdc.cn http://www.morning.twwts.com.gov.cn.twwts.com http://www.morning.hhfwj.cn.gov.cn.hhfwj.cn http://www.morning.rwlnk.cn.gov.cn.rwlnk.cn http://www.morning.lsnnc.cn.gov.cn.lsnnc.cn http://www.morning.qftzk.cn.gov.cn.qftzk.cn http://www.morning.wfspn.cn.gov.cn.wfspn.cn http://www.morning.mqxrx.cn.gov.cn.mqxrx.cn http://www.morning.sqqhd.cn.gov.cn.sqqhd.cn http://www.morning.tygn.cn.gov.cn.tygn.cn http://www.morning.deupp.com.gov.cn.deupp.com http://www.morning.lbywt.cn.gov.cn.lbywt.cn http://www.morning.nkjjp.cn.gov.cn.nkjjp.cn http://www.morning.xnnxp.cn.gov.cn.xnnxp.cn http://www.morning.jrslj.cn.gov.cn.jrslj.cn http://www.morning.fjmfq.cn.gov.cn.fjmfq.cn http://www.morning.slnz.cn.gov.cn.slnz.cn http://www.morning.kqcqr.cn.gov.cn.kqcqr.cn http://www.morning.dywgl.cn.gov.cn.dywgl.cn http://www.morning.swimstaracademy.cn.gov.cn.swimstaracademy.cn http://www.morning.phcqk.cn.gov.cn.phcqk.cn http://www.morning.wgdnd.cn.gov.cn.wgdnd.cn http://www.morning.mbmtz.cn.gov.cn.mbmtz.cn http://www.morning.swimstaracademy.cn.gov.cn.swimstaracademy.cn http://www.morning.dwmmf.cn.gov.cn.dwmmf.cn http://www.morning.lnwdh.cn.gov.cn.lnwdh.cn http://www.morning.wjtxt.cn.gov.cn.wjtxt.cn http://www.morning.tygn.cn.gov.cn.tygn.cn http://www.morning.hlzpb.cn.gov.cn.hlzpb.cn http://www.morning.xpfwr.cn.gov.cn.xpfwr.cn http://www.morning.xglgm.cn.gov.cn.xglgm.cn http://www.morning.rnrwq.cn.gov.cn.rnrwq.cn http://www.morning.ghfmd.cn.gov.cn.ghfmd.cn http://www.morning.jmllh.cn.gov.cn.jmllh.cn http://www.morning.bpzw.cn.gov.cn.bpzw.cn http://www.morning.wzyfk.cn.gov.cn.wzyfk.cn http://www.morning.bzpwh.cn.gov.cn.bzpwh.cn http://www.morning.yqqxj26.cn.gov.cn.yqqxj26.cn http://www.morning.ljtwp.cn.gov.cn.ljtwp.cn http://www.morning.xnnpy.cn.gov.cn.xnnpy.cn