Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
仅当相同的线程名称不存在时才创建线程';nt作为活动线程存在(Python)_Python_Multithreading - Fatal编程技术网

仅当相同的线程名称不存在时才创建线程';nt作为活动线程存在(Python)

仅当相同的线程名称不存在时才创建线程';nt作为活动线程存在(Python),python,multithreading,Python,Multithreading,如何仅创建指定了名称的线程,以使同名线程不处于活动状态? 例如: 这里,由于名为t1的线程已经在运行,第二个t1应该被取消。这是为了避免执行相同任务的冗余线程。但是,一旦第一个t1死亡,并且另一个同名线程(即“t1”)到达,它就应该运行。 限制条件是:10多个线程可能会尝试生成。线程名称是使用random.randint(1,10)生成的。因此,我只需要在运行时使用线程名称进行检查 这是我的密码: import logging import time import threading impor

如何仅创建指定了名称的线程,以使同名线程不处于活动状态? 例如:

这里,由于名为t1的线程已经在运行,第二个t1应该被取消。这是为了避免执行相同任务的冗余线程。但是,一旦第一个t1死亡,并且另一个同名线程(即“t1”)到达,它就应该运行。
限制条件是:10多个线程可能会尝试生成。线程名称是使用random.randint(1,10)生成的。因此,我只需要在运行时使用线程名称进行检查

这是我的密码:

import logging
import time
import threading
import random

logging.basicConfig(level=logging.DEBUG, format='[%(levelname)s] (%(threadName)-10s) %(message)s', )

e = threading.Event()
Thread_list = ['default']

def worker():
    logging.info('Starting')
    time.sleep(3)
    logging.info('Ending')
    try:
        Thread_list.remove(threading.currentThread().getName())
    except:
        pass
    return

def application_manager(appId):
    #print threading.enumerate()
    event_is_set = e.wait(2)
    if event_is_set:
        th = threading.Thread(name=appId, target=worker)
        Thread_list.append(threading.currentThread().getName())
        th.start()
    else:
        logging.warning('Task already running.')

def subsystem_request():
    for i in range(10):
        appId = random.randint(1,10)
        application_manager(appId)

def fdir():
    logging.debug('FDIR')
    count = 0
    cur = threading.currentThread()
    time.sleep(2)
    for fd in range(5):
        e.clear()
        for t in threading.enumerate():
            for u in threading.enumerate():
                if t.getName() == cur:
                    e.set()
                elif (t.getName() in u.getName()) and (t.getName() != 'MainThread'):
                    e.clear()
                else:
                    e.set()


fdir_thread = threading.Thread(name='fdir_thread', target=fdir)
fdir_thread.setDaemon(True)
fdir_thread.start()
subsystem_request()

fdir_thread.join()
实际输出:

[DEBUG] (fdir_thread) FDIR
[WARNING] (MainThread) Task already running.
[WARNING] (MainThread) Task already running.
[WARNING] (MainThread) Task already running.
[WARNING] (MainThread) Task already running.
[WARNING] (MainThread) Task already running.
[WARNING] (MainThread) Task already running.
[WARNING] (MainThread) Task already running.
[WARNING] (MainThread) Task already running.
[WARNING] (MainThread) Task already running.
[WARNING] (MainThread) Task already running.
另一个实际输出:

[INFO] (9         ) Starting
[INFO] (7         ) Starting
[INFO] (1         ) Starting
[INFO] (9         ) Starting     //This thread should be cancelled  
[INFO] (4         ) Starting
[INFO] (10        ) Starting
[INFO] (2         ) Starting
[INFO] (7         ) Starting     //This thread should be cancelled  
[INFO] (5         ) Starting
[INFO] (8         ) Starting
[INFO] (9         ) Ending
[INFO] (1         ) Ending
[INFO] (7         ) Ending
[INFO] (9         ) Ending
[INFO] (2         ) Ending
[INFO] (10        ) Ending
[INFO] (4         ) Ending
[INFO] (7         ) Ending
[INFO] (5         ) Ending
[INFO] (8         ) Ending 
[INFO] (9         ) Starting
[INFO] (7         ) Starting
[INFO] (1         ) Starting
[INFO] (4         ) Starting
[INFO] (10        ) Starting
[INFO] (2         ) Starting
[INFO] (5         ) Starting
[INFO] (8         ) Starting
[INFO] (9         ) Ending
[INFO] (1         ) Ending
[INFO] (7         ) Ending
[INFO] (2         ) Ending
[INFO] (10        ) Ending
[INFO] (4         ) Ending
[INFO] (5         ) Ending
[INFO] (8         ) Ending
预期输出:

[INFO] (9         ) Starting
[INFO] (7         ) Starting
[INFO] (1         ) Starting
[INFO] (9         ) Starting     //This thread should be cancelled  
[INFO] (4         ) Starting
[INFO] (10        ) Starting
[INFO] (2         ) Starting
[INFO] (7         ) Starting     //This thread should be cancelled  
[INFO] (5         ) Starting
[INFO] (8         ) Starting
[INFO] (9         ) Ending
[INFO] (1         ) Ending
[INFO] (7         ) Ending
[INFO] (9         ) Ending
[INFO] (2         ) Ending
[INFO] (10        ) Ending
[INFO] (4         ) Ending
[INFO] (7         ) Ending
[INFO] (5         ) Ending
[INFO] (8         ) Ending 
[INFO] (9         ) Starting
[INFO] (7         ) Starting
[INFO] (1         ) Starting
[INFO] (4         ) Starting
[INFO] (10        ) Starting
[INFO] (2         ) Starting
[INFO] (5         ) Starting
[INFO] (8         ) Starting
[INFO] (9         ) Ending
[INFO] (1         ) Ending
[INFO] (7         ) Ending
[INFO] (2         ) Ending
[INFO] (10        ) Ending
[INFO] (4         ) Ending
[INFO] (5         ) Ending
[INFO] (8         ) Ending
每个活动线程在运行期间都有唯一的名称。
我正在使用threading.Event()。因此,函数应用程序_管理器等待2秒,func fdir()使用同名的threading.enumerate()进行检查,如果是,则e.clear()否则,e.set()。一旦e.set(),应用程序_管理器()将创建线程

我想使用fdir()进行检查,然后与应用程序管理器()通信以生成或取消线程。

注意:fdir()和application_manager()应该是两个不同的线程。

更好的方法是重构代码以使用对象


虽然这正是您所描述的-即,如果其他人持有锁,执行将被“取消”,但您最好进行重构,以避免完全调用线程。

您可以使用thread.is\u alive()函数

    if t1.is_alive() == 0:
        threading.Thread(name='t1', target=foo).start()

编辑:

使用:

    texists = 0
    for t in threads:
        if t.name() == 't1':
            texists = 1

您可以检查它是否存在,然后使用if语句确定它是否存在

这就是我如何使用存储appId的全局列表解决问题的方法,它不从活动线程中检查,而是从列表中检查,一旦线程死亡,它就会从列表中删除,尽管无法根据需要使用threading.Event()进行线程间的通信

import logging
import time
import threading
import random

logging.basicConfig(level=logging.DEBUG, format='[%(levelname)s] (%(threadName)s) %(message)s', )

name_check = []

def worker():
    logging.info('Starting to process')
    time.sleep(3)
    logging.info('Ending')
    return

def application_manager(appId):
    name_ID="appId-"+str(appId)
    if name_ID in name_check:
        logging.warning('Task already running.')
        threading.Thread(name=fdir, target=fdir).start()
    else:
        th = threading.Thread(name=name_ID, target=worker)
        th.start()
    name_check.append(name_ID)

def subsystem_request():
    for i in range(10):
        appId = random.randint(1,10)
        application_manager(appId)

def fdir():
    logging.debug('Task cancelled')
    return  

subsystem_request()

这听起来像是一个案例。你到底想做什么?我试图制作一个程序,这样它只会创建与活动线程名称相比具有唯一名称的线程@ASADSAEDUDINSURE这不是该计划的“目的”吗?这就是@asadsaeeddin所暗示的。您似乎应该首先重新编写(描述)创建线程的逻辑。这里,t1是线程对象名。我需要检查wrt线程名称。问题是,这不是第一次定义<代码>如果th.is_alive()=0和th.getName()!=appId:th=threading.Thread(name=appId,target=worker)th.start()我使用的是random.randint(1,10),因此我必须在运行时访问t.name(),并检查所有不断变化的活动线程名称。使用set()而不是list来提高查找速度