Python高级开发————进程与线程

本文介绍了Python中使用multiprocess模块创建两个进程来分别处理文本文件的上下两部分内容,并将内容写入新文件。同时,探讨了基于threading的UDP网络并发实现,包括至少2个客户端与服务器之间的数据转发模型。
摘要由CSDN通过智能技术生成

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值