首页 > 编程知识 正文

包含python的携程使用以及通信的词条

时间:2023-12-28 21:11:02 阅读:329114 作者:EOZY

本文目录一览:

python基础(21)-线程通信

到这里,我们要聊一下线程通信的内容;

首先,我们抛开语言不谈,先看看比较基础的东西,线程间通信的方式;其实也就是哪几种(我这里说的,是我的所谓的知道的。。。)事件,消息队列,信号量,条件变量(锁算不算?我只是认为是同步的一种);所以我们也就是要把这些掌握了,因为各有各的好处嘛;

条件变量我放到了上面的线程同步里面讲了,我总感觉这算是同步的一种,没有很多具体信息的沟通;同时吧,我认为条件变量比较重要,因为这种可以应用于线程池的操作上;所以比较重要;这里,抛开条件变量不谈,我们看看其他的东西;

1、消息队列:

queue 模块下提供了几个阻塞队列,这些队列主要用于实现线程通信。在 queue 模块下主要提供了三个类,分别代表三种队列,它们的主要区别就在于进队列、出队列的不同。

关于这三个队列类的简单介绍如下:

queue.Queue(maxsize=0):代表 FIFO(先进先出)的常规队列,maxsize 可以限制队列的大小。如果队列的大小达到队列的上限,就会加锁,再次加入元素时就会被阻塞,直到队列中的元素被消费。如果将 maxsize 设置为 0 或负数,则该队列的大小就是无限制的。

queue.LifoQueue(maxsize=0):代表 LIFO(后进先出)的队列,与 Queue 的区别就是出队列的顺序不同。

PriorityQueue(maxsize=0):代表优先级队列,优先级最小的元素先出队列。

这三个队列类的属性和方法基本相同, 它们都提供了如下属性和方法:

Queue.qsize():返回队列的实际大小,也就是该队列中包含几个元素。

Queue.empty():判断队列是否为空。

Queue.full():判断队列是否已满。

Queue.put(item, block=True, timeout=None):向队列中放入元素。如果队列己满,且 block 参数为 True(阻塞),当前线程被阻塞,timeout 指定阻塞时间,如果将 timeout 设置为 None,则代表一直阻塞,直到该队列的元素被消费;如果队列己满,且 block 参数为 False(不阻塞),则直接引发 queue.FULL 异常。

Queue.put_nowait(item):向队列中放入元素,不阻塞。相当于在上一个方法中将 block 参数设置为 False。

Queue.get(item, block=True, timeout=None):从队列中取出元素(消费元素)。如果队列已满,且 block 参数为 True(阻塞),当前线程被阻塞,timeout 指定阻塞时间,如果将 timeout 设置为 None,则代表一直阻塞,直到有元素被放入队列中; 如果队列己空,且 block 参数为 False(不阻塞),则直接引发 queue.EMPTY 异常。

Queue.get_nowait(item):从队列中取出元素,不阻塞。相当于在上一个方法中将 block 参数设置为 False。

其实我们想想,这个队列,是python进行封装的,那么我们可以用在线程间的通信;同时也是可以用做一个数据结构;先进先出就是队列,后进先出就是栈;我们用这个栈写个十进制转二进制的例子:

没毛病,可以正常的打印;其中需要注意的就是,maxsize在初始化的时候如果是0或者是个负数的话,那么就会是不限制大小;

那么其实我们想想,我们如果用做线程通信的话,我们两个线程,可以把队列设置为1的大小,如果是1对多,比如是创建者和消费者的关系,我们完全可以作为消息队列,比如说创建者一直在创建一些东西,然后放入到消息队列里面,然后供消费着使用;就是一个很好的例子;所以,其实说是消息队列,也就是队列,没差;

=====================================================================

下面来看一下事件

Event 是一种非常简单的线程通信机制,一个线程发出一个 Event,另一个线程可通过该 Event 被触发。

Event 本身管理一个内部旗标,程序可以通过 Event 的 set() 方法将该旗标设置为 True,也可以调用 clear() 方法将该旗标设置为 False。程序可以调用 wait() 方法来阻塞当前线程,直到 Event 的内部旗标被设置为 True。

Event 提供了如下方法:

is_set():该方法返回 Event 的内部旗标是否为True。

set():该方法将会把 Event 的内部旗标设置为 True,并唤醒所有处于等待状态的线程。

clear():该方法将 Event 的内部旗标设置为 False,通常接下来会调用 wait() 方法来阻塞当前线程。

wait(timeout=None):该方法会阻塞当前线程。

这里我想解释一下;其实对于事件来说,事件可以看成和条件变量是一样的,只是我们说说不一样的地方;

1、对于事件来说,一旦触发了事件,也就是说,一旦set为true了,那么就会一直为true,需要clear调内部的标志,才能继续wait;但是conditon不是,他是一次性的唤醒其他线程;

2、conditon自己带锁;事件呢?不是的;没有自己的锁;比如说有一个存钱的线程,有一个是取钱的线程;那么存钱的线程要存钱;需要怎么办呢?1、发现银行没有钱了(is_set判断);2、锁住银行;3、存钱;4、释放银行;5、唤醒事件;对于取钱的人;1、判断是否有钱;2、被唤醒了,然后锁住银行;3、开始取钱;4、清理告诉存钱的人,我没钱了(clear);5、释放锁;6、等着钱存进去;

其实说白了,就是记住一点;这个旗标需要自己clear就对了

写个例子,怕以后忘了怎么用;

其实时间和信号量比较像;但是信号量不用自己清除标志位;但是事件是需要的;

用python 怎么和硬件进行链接,通信,交互?

本文介绍了用python与文件进行交互的方法,分享给大家,具体如下:

一.文件处理

1.介绍

计算机系统:计算机硬件,操作系统,应用程序

应用程序无法直接操作硬件,通过操作系统来操作文件,进而读/写硬件中的文件。

python打开文件过程:

#打开

f=open('a.txt','r')

#通过句柄对文件进行操作

read_f=f.read()

#关闭文件

f.close()

with open('a.txt','r') as f: #不需要关闭

f.close() #回收操作系统打开的文件

del f #回收应用程序级的变量

2.打开文件的模式

a.打开文本文件

#r,只读模式【默认模式,文件必须存在,不存在则抛出异常】

f=open('a.txt',encoding='utf-8')

data1=f.read()

print(f.readline(),end='')

print(f.readlines())

#w,只写模式【不可读;不存在则创建;存在则清空内容】

f=open('a.txt','w',encoding='utf-8')

f.write('werf')

#a,只追加写模式【不可读;不存在则创建;存在则只追加内容】

f=open('a.txt','a',encoding='utf-8')

f.write('werfn')

b.对于非文本文件,只能使用b模式,"b"表示以字节的方式操作(而所有文件也都是以字节的形式存储的,使用这种模式无需考虑文本文件的字符编码、图片文件的jgp格式、视频文件的avi格式

with open('1.jpg','rb') as f_read:

data=f_read.read()

print(data)

with open('a.txt','rb') as f_read:

data=f_read.read().decode('utf-8') #解码

print(data)

with open('a.txt','wb')as f_write:

f_write.write('adsf'.encode('utf-8'))

'''

练习,利用b模式,编写一个cp工具,要求如下:

1. 既可以拷贝文本又可以拷贝视频,图片等文件

2. 用户一旦参数错误,打印命令的正确使用方法,如usage: cp source_file target_file

'''

import sys

if len(sys.argv)!=3:

print('usage:cp source_file target_file')

sys.exit()

source_file,target_file=sys.argv[1],sys.argv[2]

print()

with open(source_file,'rb')as f_read,open(target_file,'wb')as f_write:

for line in f_read:

f_write.write(line)

3.文件内光标的移动

#以文本模式读文件,n代表的是字符的个数

with open('a.txt','r')as f_read:

data=f_read.read(6)

print(data)

#以b模式读文件,n代表的是字节的个数

with open('a.txt','rb')as f_read:

data=f_read.read(6)

print(data)

# tell:告诉当前光标的位置

with open('a.txt','r',encoding='utf-8')as f_read:

data=f_read.read(4)

data1=f_read.tell()

print(data,data1)

# seek:移动光标(0:文件开头默认;1:文件当前光标;2:文件末尾)

with open('a.txt', 'r', encoding='utf-8')as f_read:

data = f_read.seek(3)

data1 = f_read.read()

print(data, data1)

# 实现tail功能

import time

with open('access.log', 'rb')as f_read:

f_read.seek(0,2)

while True:

line = f_read.readline()

if line:

print(line.decode('utf-8'),end='')

else:

time.sleep(1)

4.文件的修改

import os

with open('a.txt') as read_f,open('.a.txt.swap','w') as write_f:

for line in read_f:

line=line.replace('alex','SB')

write_f.write(line)

os.remove('a.txt')

os.rename('.a.txt.swap','a.txt')

Linux平台下python中有什么方法可以与一个进程通信

本文实例讲解了python实现两个程序之间通信的方法,具体方法如下:

该实例采用socket实现,与socket网络编程不一样的是socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)的第一个参数是socket.AF_UNIX

而不是 socket.AF_INET

例中两个python程序 s.py/c.py 要先运行s.py

基于fedora13/python2.6测试,成功实现!

s.py代码如下:

#!/usr/bin/env python

import socket

import os

if __name__ == '__main__':

sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)

conn = '/tmp/conn'

if not os.path.exists(conn):

os.mknod(conn)

if os.path.exists(conn):

os.unlink(conn)

sock.bind(conn)

sock.listen(5)

while True:

connection,address = sock.accept()

data = connection.recv(1024)

if data == "hello,server":

print "the client said:%s!n" % data

connection.send("hello,client")

connection.close()

c.py代码如下:

#!/usr/bin/env python

import socket

import time

if __name__ == '__main__':

sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)

conn = '/tmp/conn'

sock.connect(conn)

time.sleep(1)

sock.send('hello,server')

print sock.recv(1024)

sock.close()

python线程间通信的问题,回答有加分!300

pyqt的线程之间的通信是通过信号to槽来实现的,首先你在线程类里面声明一个全局槽比如:

class imThread(QtCore.QThread):

    imslot = QtCore.pyqtSignal()

这里是要重点注意,上面的是没有任何参数的一个信号,如果你需要参数的话,你可以在里面添加参数类型,例如:

imslot1 = QtCore.pyqtSignal(str)    #这是一个带字符串参数的信号

imslot2 = QtCore.pyqtSignal(int)    #这是一个带整型参数的信号

imslot3 = QtCore.pyqtSignal(bool)   #这是一个带布尔参数的信号

当然了,如果你需要多个参数的话,同样地往里面加就是了,qt也没有要求参数必须是同类型的,所以可以这样:

imslot1 = QtCore.pyqtSignal(str, int)    #这是一个带整型和字符串的参数信号

imslot2 = QtCore.pyqtSignal(int, str, str)    #这是一个带整型和两个字符串的参数信号

imslot3 = QtCore.pyqtSignal(bool, str) #这是一个带布尔和字符串的参数信号

在线程的run方法里面来定义执行信号:

self.imslot.emit()

这里也是需要重点注意的是,上面这个接口是没有参数的,如果你是要参数的话,是需要这样写:

self.imslot1[str].emit('hello')

self.imslot2[int].emit(1)

self.imslot3[bool].emit(False)

多参数的是这样

self.imslot1[str, int].emit('hello', 1)

self.imslot2[int, str, str].emit(1, "hello", "world")

self.imslot3[bool, str].emit(False, 'hello')

以上就是在线程类里面完成信号定义了,接下来就是逻辑层成定义一个函数槽来连接线程类里面的信号,这个也很简单,比如我在主线程类里面定义一个方法:

def imSlot():

    print 'ok'

以上这个是槽函数,接下来是实现信号槽的连接

imThread.imslot.connect('imSlot')

这个就是信号槽的连接方式,当然了,这个是没有参数的一个信号槽,那么带参数的怎么写呢?也很简单!首先定义一个槽函数:

def imSlot(para):

    print para

这个是带参数的槽函数,下面是:

imThread.imslot[str].connect('imSlot')

以上就是线程之间的方法了,子线程在执行的通行经过执行信号的话,子线程可以安全地执行而不会出现GUI主线程卡死的情况了。

学会python能干嘛 盘点python在这五个应用领域的作用

Python作为一种功能强大的编程语言,因其简单易学而受到很多开发者的青睐。那么,Python 的应用领域有哪些呢?概括起来,Python的应用领域主要有如下几个,这也是学完python将要从事的相关工作。

1、Web应用开发:

Python经常被用于 Web 开发。例如,通过 mod_wsgi 模块,Apache 可以运行用 Python 编写的 Web 程序。Python 定义了 WSGI 标准应用接口来协调 HTTP 服务器与基于 Python 的 Web 程序之间的通信。

不仅如此,一些 Web 框架(如 Django、TurboGears、web2py 等等)可以让程序员轻松地开发和管理复杂的Web程序。

举个最直观的例子,全球最大的搜索引擎 Google,在其网络搜索系统中就广泛使用 Python 语言。另外,我们经常访问的集电影、读书、音乐于一体的豆瓣网,也是使用 Python 实现的。

2、操作系统管理、自动化运维开发

很多操作系统中,Python 是标准的系统组件,大多数 Linux 发行版以及 NetBSD、OpenBSD 和 Mac OS X 都集成了 Python,可以在终端下直接运行 Python。

有一些 Linux 发行版的安装器使用 Python 语言编写,例如 Ubuntu 的 Ubiquity 安装器、Red Hat Linux 和 Fedora 的 Anaconda 安装器等等。

另外,Python 标准库中包含了多个可用来调用操作系统功能的库。例如,通过 pywin32 这个软件包,我们能访问 Windows 的 COM 服务以及其他 Windows API;使用 IronPython,我们能够直接调用 .Net Framework。

通常情况下,Python 编写的系统管理脚本,无论是可读性,还是性能、代码重用度以及扩展性方面,都优于普通的 shell 脚本。

3、游戏开发

很多游戏使用 C++ 编写图形显示等高性能模块,而使用 Python 或 Lua 编写游戏的逻辑。和 Python 相比,Lua 的功能更简单,体积更小;而 Python 则支持更多的特性和数据类型。

比如说,国际上指明的游戏 Sid Meier's Civilization,就是使用 Python 实现的。

4、编写服务器软件

Python 对于各种网络协议的支持很完善,所以经常被用于编写服务器软件以及网络爬虫。

比如说,Python 的第三方库 Twisted,它支持异步网络编程和多数标准的网络协议(包含客户端和服务器端),并且提供了多种工具,因此被广泛用于编写高性能的服务器软件。

5、科学计算

NumPy、SciPy、Matplotlib 可以让 Python 程序员编写科学计算程序。

以上都只是 Python 应用领域的冰山一角,总的来说,Python 语言不仅可以应用到网络编程、游戏开发等领域,还可以在图形图像处理、只能机器人、爬取数据、自动化运维等多方面展露头角,为开发者提供简约、优雅的编程体验。

其实python的相关工作远不止这些,生活中的各行各业都有python的身影,所以,学Python,是明智的选择!

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。