小编mar*_*rkk的帖子

Python 3在队列为空之前调用join时,多处理队列死锁

我有一个问题,了解multiprocessingpython 3中模块中的队列

这就是他们在编程指南中所说的:

请记住,将项目放入队列的进程将在终止之前等待,直到所有缓冲的项目由"feeder"线程提供给底层管道.(子进程可以调用队列的Queue.cancel_join_thread方法来避免此行为.)

这意味着无论何时使用队列,您都需要确保在加入进程之前最终删除已放入队列的所有项目.否则,您无法确定已将项目放入队列的进程将终止.还要记住,非守护进程会自动加入.

将导致死锁的示例如下:

from multiprocessing import Process, Queue

def f(q):
    q.put('X' * 1000000)

if __name__ == '__main__':
    queue = Queue()
    p = Process(target=f, args=(queue,))
    p.start()
    p.join()                    # this deadlocks
    obj = queue.get()

这里的一个修复是交换最后两行(或简单地删除p.join()行).

所以显然,queue.get()不应该在之后调用join().

但是,有一些使用队列的例子,getjoin类似之后调用:

import multiprocessing as mp
import random
import string

# define a example function
def rand_string(length, output):
    """ Generates a random string of numbers, lower- and uppercase chars. """
    rand_str = …
Run Code Online (Sandbox Code Playgroud)

python multithreading

20
推荐指数
2
解决办法
1万
查看次数

ipython笔记本关闭后保存变量

关闭 ipython 笔记本后,我意识到所有代码都在那里,但名称空间已被重置,因为我拥有的所有变量都消失了。有没有办法可以保存变量,以便当我重新打开 ipython 笔记本时,变量都在那里,而无需重新运行代码?

python ipython jupyter-notebook

5
推荐指数
1
解决办法
6753
查看次数