Python高级开发————进程与线程
需求
1、基于multiprocess创建两个进程,同时复制进程.txt文件的上下两半部分,并各自将上下两个部分内容复制到两个新的text文件里。
2、基于threading的多线程网络并发实现。将实验五的第二题更改成:
(1)网络模型,UDP通信;
(2)包含至少2个客户端;
(3)转发模型,客户端服务器—>转发给其他客户端;
实现
1.py
进程.txt
111111111111111111111;
二二二二二二二二二二二二;
33333333333333333333;
四四四四四四四四四四四四;
55555555555555555555;
六六六六六六六六六六六六;
77777777777777777777;
八八八八八八八八八八八八;
9999999999999999999999999;
十十十十十十十十十十十十十。
import multiprocessing as mp
from multiprocessing import Lock
lock=Lock()
def last():
lock.acquire()
n=0
with open('shiyan6.txt', 'r', encoding='utf-8')as f:
msg = f.readlines()
m = int(len(list(msg)))
for line in msg:
n = n + 1
if n < m // 2+1:
print(line)
with open('1_1.txt', 'a', encoding='utf-8')as f1:
f1.writelines(line)
f1.writelines('\n')
lock.release()
if __name__=='__main__':
n=0
p=mp.Process(target=last)
p.start()
lock.acquire()
with open('shiyan6.txt', 'r', encoding='utf-8')as f:
msg = f.readlines()
m=int(len(list(msg)))
for line in msg:
n = n + 1
if n > m // 2:
print(line)
with open('1_2.txt', 'a', encoding='utf-8')as f2:
f2.writelines(line)
f2.writelines('\n')
lock.release()
p.join()
以下两个client都会用到GUI编程。
client.py
from socket import *
import pymysql
from PyQt5.QtWidgets import QMainWindow, QApplication, QPushButton, QDialog, QInputDialog
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_Dialog(object):
def __init__(self):
self.s = socket(AF_INET, SOCK_DGRAM)
def setupUi(self, Dialog):
Dialog.setObjectName("Dialog")
Dialog.resize(481, 439)
self.textEdit = QtWidgets.QTextEdit(Dialog)
self.textEdit.setGeometry(QtCore.QRect(0, 0, 341, 291))
self.textEdit.setObjectName("textEdit")
self.pushButton = QtWidgets.QPushButton(Dialog)
self.pushButton.setGeometry(QtCore.QRect(370, 300, 100, 40))
self.pushButton.setObjectName("pushButton")
self.lineEdit = QtWidgets.QLineEdit(Dialog)
self.lineEdit.setGeometry(QtCore.QRect(50, 340, 100, 40))
self.lineEdit.setObjectName("lineEdit")
self.label = QtWidgets.QLabel(Dialog)
self.label.setGeometry(QtCore.QRect(10, 340, 100, 40))
self.label.setObjectName("label")
self.lineEdit_2 = QtWidgets.QLineEdit(Dialog)
self.lineEdit_2.setGeometry(QtCore.QRect(0, 300, 300, 30))
self.lineEdit_2.setObjectName("lineEdit_2")
self.pushButton_2 = QtWidgets.QPushButton(Dialog)
self.pushButton_2.setGeometry(QtCore.QRect(370, 350, 100, 40))
self.pushButton_2.setObjectName("pushButton_2")
self.pushButton_3 = QtWidgets.QPushButton(Dialog)
self.pushButton_3.setGeometry(QtCore.QRect(370, 400, 100, 40))
self.pushButton_3.setObjectName("pushButton_3")
self.retranslateUi(Dialog)
self.pushButton.clicked.connect(self.slot1)
self.pushButton_2.clicked.connect(self.slot2)
self.pushButton_3.clicked.connect(self.slot3)
QtCore.QMetaObject.connectSlotsByName(Dialog)
def retranslateUi(self, Dialog):
_translate = QtCore.QCoreApplication.translate
Dialog.setWindowTitle(_translate("Dialog", "Dialog"))
self.pushButton.setText(_translate("Dialog", "发送消息"))
self.label.setText(_translate("Dialog", "姓名:"))
self.pushButton_2.setText(_translate("Dialog", "接收消息"))
self.pushButton_3.setText(_translate("Dialog", "清屏"))
def slot1(self):
name = self.lineEdit.text()
message = self.lineEdit_2.text()
HOST = "127.0.0.1"
PORT = 12000
ADDR = (HOST, PORT)
message = name + " : " + message
self.s.sendto(message.encode(), ADDR)
self.textEdit.append(message)
def slot2(self):
msg, sddr = self.s.recvfrom(2048)
self.textEdit.append(msg.decode())
def slot3(self):
self.textEdit.clear()
app = QApplication(sys.argv)
Form = QDialog()
ui = Ui_Dialog()
ui.setupUi(Form)
Form.show()
sys.exit(app.exec_())
client_2.py
from socket import *
from PyQt5.QtWidgets import QMainWindow, QApplication, QPushButton, QDialog, QInputDialog
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_Dialog(object):
def __init__(self):
self.s = socket(AF_INET, SOCK_DGRAM)
def setupUi(self, Dialog):
Dialog.setObjectName("Dialog")
Dialog.resize(481, 439)
self.textEdit = QtWidgets.QTextEdit(Dialog)
self.textEdit.setGeometry(QtCore.QRect(0, 0, 341, 291))
self.textEdit.setObjectName("textEdit")
self.pushButton = QtWidgets.QPushButton(Dialog)
self.pushButton.setGeometry(QtCore.QRect(370, 300, 100, 40))
self.pushButton.setObjectName("pushButton")
self.lineEdit = QtWidgets.QLineEdit(Dialog)
self.lineEdit.setGeometry(QtCore.QRect(50, 340, 100, 40))
self.lineEdit.setObjectName("lineEdit")
self.label = QtWidgets.QLabel(Dialog)
self.label.setGeometry(QtCore.QRect(10, 340, 100, 40))
self.label.setObjectName("label")
self.lineEdit_2 = QtWidgets.QLineEdit(Dialog)
self.lineEdit_2.setGeometry(QtCore.QRect(0, 300, 300, 30))
self.lineEdit_2.setObjectName("lineEdit_2")
self.pushButton_2 = QtWidgets.QPushButton(Dialog)
self.pushButton_2.setGeometry(QtCore.QRect(370, 350, 100, 40))
self.pushButton_2.setObjectName("pushButton_2")
self.pushButton_3 = QtWidgets.QPushButton(Dialog)
self.pushButton_3.setGeometry(QtCore.QRect(370, 400, 100, 40))
self.pushButton_3.setObjectName("pushButton_3")
self.retranslateUi(Dialog)
self.pushButton.clicked.connect(self.slot1)
self.pushButton_2.clicked.connect(self.slot2)
self.pushButton_3.clicked.connect(self.slot3)
QtCore.QMetaObject.connectSlotsByName(Dialog)
def retranslateUi(self, Dialog):
_translate = QtCore.QCoreApplication.translate
Dialog.setWindowTitle(_translate("Dialog", "Dialog"))
self.pushButton.setText(_translate("Dialog", "发送消息"))
self.label.setText(_translate("Dialog", "姓名:"))
self.pushButton_2.setText(_translate("Dialog", "接收消息"))
self.pushButton_3.setText(_translate("Dialog", "清屏"))
def slot1(self):
name = self.lineEdit.text()
message = self.lineEdit_2.text()
HOST = "127.0.0.1"
PORT = 12000
ADDR = (HOST, PORT)
message = name + " : " + message
self.s.sendto(message.encode(), ADDR)
self.textEdit.append(message)
def slot2(self):
msg, sddr = self.s.recvfrom(2048)
self.textEdit.append(msg.decode())
def slot3(self):
self.textEdit.clear()
app = QApplication(sys.argv)
Form = QDialog()
ui = Ui_Dialog()
ui.setupUi(Form)
Form.show()
sys.exit(app.exec_())
server.py
from socket import *
from threading import Thread
# import pymysql
client_list=[]
#
# db = pymysql.Connect(
# host='localhost', ##mysql服务器地址
# user='root', ##用户名
# passwd='123456', ##密码
# db='chat', ##数据库名
# charset='utf8' ##连接编码
# )
# cursor = db.cursor()
def server(address,message):
print("收到消息!")
modifiedmessage = message
if address not in client_list:
client_list.append(address)
for client in client_list:
if client[1]!=address[1]:
s.sendto(modifiedmessage,client)
# sql = "insert into chat_info (info) values ('%s');" % (message.decode())
# cursor.execute(sql)
# db.commit()
HOST='127.0.0.1'
PORT=12000
addr=(HOST,PORT)
s=socket(AF_INET,SOCK_DGRAM)
s.bind(addr)
print("服务器准备接受")
while True:
message, address = s.recvfrom(2048)
t=Thread(target=server,args=(address,message))
t.start()
t.join()