Python 如何在多处理过程中将未勾选的对象作为参数传递?
我正在取消勾选一个对象,并作为进程的参数之一传递。未获得任何输出 我想知道这种取消勾选并将对象作为参数传递的方法是否会导致多处理错误。我们将为此做些什么Python 如何在多处理过程中将未勾选的对象作为参数传递?,python,multiprocessing,queue,pickle,python-multiprocessing,Python,Multiprocessing,Queue,Pickle,Python Multiprocessing,我正在取消勾选一个对象,并作为进程的参数之一传递。未获得任何输出 我想知道这种取消勾选并将对象作为参数传递的方法是否会导致多处理错误。我们将为此做些什么 来自多处理导入进程,队列 def func(arg1、arg2、q): df_temp=arg1[arg1['col'].isin(arg2)] q、 放置(df_温度) 如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu': 进口泡菜 作为pd进口熊猫 arg1=pickle.load(打开('path.p',
来自多处理导入进程,队列
def func(arg1、arg2、q):
df_temp=arg1[arg1['col'].isin(arg2)]
q、 放置(df_温度)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
进口泡菜
作为pd进口熊猫
arg1=pickle.load(打开('path.p','rb'))
arg2=pd.Series(pd.date_range(end='some_date',periods=12,freq='MS')).dt.to_pydatetime()
arg2=[i.date()表示arg2中的i]
q=队列()
p=进程(目标=func,args=(arg1,arg2,q))
p、 开始()
p、 加入
而不是q.empty():
w=q.get()
由于其他原因,您的系统处于死锁状态
默认情况下,如果进程不是队列的创建者,则在退出时
它将尝试加入队列的后台线程。这个过程可以
调用cancel\u join\u thread()使join\u thread()不执行任何操作
您的进程
将不会退出,因为它正在从多处理.Queue
加入一个进料器线程,该线程将在您第一次Queue.put()
时启动。在加入流程之前,您需要在父级中queue.get()
警告:如上所述,如果子进程已将项目放置在
队列(并且它没有使用JoinableQueue.cancel\u join\u thread),然后
在所有缓冲项都被删除之前,该进程不会终止
冲洗到管道上。这意味着如果你尝试加入这个过程
您可能会遇到死锁,除非您确定
已放在队列上的已被消耗。同样,如果孩子
进程是非守护进程,则父进程在退出时可能会挂起
它试图加入所有非恶魔的子对象
也不要使用,而不要使用q.empty()
,这是一种反模式,一旦有多个使用者,就会导致死锁。
使用sentinel值来通知消费者不再有其他物品。更多关于这个