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