Python 队列Queue和管道Pipes是如何实现的?

问题1:

队列和管道好像是基于文件的?
就是把信息发送到特定文件?再从文件中读取?
如果是这样,那么这个文件生成在哪个目录?隐藏吗?对用户可见吗?如果在linux下,对用户权限如何?
如果不是基于文件,那么是如何实现?

问题2:

# 创建一个队列
q = Queue()
# 阻塞模式下直接读取会阻塞(因为没数据传入队列)
value = q.get()

阻塞表示程序知道我还得取得一个值,就等待一个值发送进来,那么总要有个检测间隔嘛?
这个检测间隔是多少?多少秒?对,就是时间是多少?

为什么问这个?
因为,如果自己写的话:

while True:
    if flag == True:
        #do sonming #
        break

flag迟迟不变为True的话直接cpu就满了,所以我一般写如上代码都会加一个time.sleep(n),让程序中断n秒后再检测Flag的值

while True:
    if flag == True:
        #do sonming #
        break
    time.sleep(1)

这样完全不用考虑消耗cpu的问题,因为1秒对于cpu来说"太长"了
在线程中更简单的是,直接使用队列,队列传入一个flag值进来让程序继续运行,完全不用while True:

# 
q = Quant()
# 定义线程函数
def thread_fun():
    # 要是没有值进来下面这句就无限阻塞
    q.get()
    # 当有某个值q.put()时就会接着运行
    #do sonming #

(不知道说的对不对,不对请指出,下面这句)
我这久都是这么写的,我觉得这样可以很好的控制,最主要的是队列和管道不用考虑锁的问题,这样写不知道效率如何,还是我考虑多了
我猜测q.get()里的实现肯定有while True啊,那么他要不要控制检测的频率??

还是文件系统的检测有什么不一样?
因为我还写过一个一个进程写一个文件,一个进程读同一个文件的,读的进程读到文件的末尾,可以接着readline,只是返回''(空字符串)就是了,这样我肯定不能让读的进程无限读文件啊,消耗cpu和IO,后来我就加了time.sleep(0.5),我觉得对于人来看,0.5秒的间隔够了

但是我比较贪心啊,想追求效率,就是q.get()如果内部不用循环检测的话,那么效率应该会比较高,请问其实如何实现的?

想再开个问题问协程的,这个和协程有没有关系?(还在学习)
算了,不问了,以上
谢谢

阅读 3.1k
1 个回答

1、队列和管道如果你指的是multiprocessing,那多进程之间通信是在内存层面实现的
2、q.get() https://docs.python.org/3.6/l...
你没有传参数,所以会一直等到队列的下一个数据为止,你可以设置q.get(timeout=10) 10秒后拿不到数据就超时

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题