使用多处理在Python中实现进程安全

2024-10-05 14:29:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用多处理库编写一个基本的python脚本。我们的目标是有一个while循环,直到键盘中断为止。在while循环期间,它将请求一个将被输入的命令。根据此命令,它将创建一个运行特定函数的进程,然后将其存储在进程队列中。在每个while循环结束时,它将从进程队列中获取第一个队列并运行它。我希望线程安全,因为只有一个进程将运行,但我很难弄清楚如何实现这一点使用锁实用程序提供的多处理。我已经附上我的代码如下,任何帮助都非常感谢。目前,一个进程将运行是安全的,但是如果队列增加超过1,它将根本不会运行。你知道吗

import multiprocessing
from multiprocessing import Process, Queue
import numpy as np

l = multiprocessing.Lock()
semaphore = 0
processHold = 0

def proc1():
    global l
    global semaphore
    global processHold
    matrix_inverse()
    print 'proc1 done'
    return

def proc2():
    global l
    global semaphore
    global processHold
    print 'proc2 done'
    return

def matrix_inverse():
    global l
    global semaphore
    global processHold
    M = np.random.rand(2500,2500)
    Minv = np.linalg.inv(M)

def main():
    global l
    global semaphore
    global processHold
    processQueue = multiprocessing.Queue()
    while(True):
        cmd = raw_input('Enter proc1 or proc2')
        if cmd == 'proc1':
            name = 'myProc1'
            processQueue.put(name)
        elif cmd =='proc2':
            name = 'myProc2'
            processQueue.put(name)
        else:
            print 'invalid command'
        if processHold==1:
            print 'enter here'
            if p.is_alive==True:
                processHold==1
                print 'process is still alive, set processHold'
            processHold==0
            print 'stuck in processHold'
            print 'processhold '+str(processHold)
        print 'qsize '+str(processQueue.qsize())
        if (processQueue.qsize()>0)&(processHold==0):
            if semaphore>0:
                l.release()
                semaphore=semaphore-1
                print 'stuck in semaphore'
                print 'semaphore '+str(semaphore)
            currentProcess = processQueue.get()
            if currentProcess=='myProc1':
                l.acquire(block=True, timeout=None)
                semaphore=semaphore+1
                p = Process(name=currentProcess,target=proc1)
                processHold=processHold+1
                print 'stuck in myProc1'
            elif currentProcess=='myProc2':
                l.acquire(block=True, timeout=None)
                semaphore=semaphore+1
                p = Process(name=currentProcess,target=proc2)
                processHold=processHold+1
                print 'stuck in myProc2'

            p.start()
        elif (processQueue.qsize()>0)&(processHold==1):
            print 'Current process running: '+str(currentProcess)+' with '+str(processQueue.qsize())+' processes waiting'
        else:
            print 'no current processes'

if __name__ == '__main__':
    main()

Tags: nameif队列进程globalprintwhilestr