Потоки демонов Python, кажется, не работают в фоновом режиме - PullRequest
0 голосов
/ 25 сентября 2019

Я взял фрагмент кода из https://www.bogotobogo.com/python/Multithread/python_multithreading_Daemon_join_method_threads.php и добавил три строки, ожидая, что сработает демон, удаляющий любой файл с именем «Tested».Он работает при запуске, но если во время запуска демона (я полагаю, он это делает) я создаю новый файл из командной строки (в GNU / linux), используя «touch test», ничего не происходит.Я читал об этом, но у меня должно быть что-то, что я делаю неправильно, если в фоновом режиме работает действительно многопоточный демон.

import threading
import time
import logging
import os
logging.basicConfig(level=logging.DEBUG,
                    format='(%(threadName)-9s) %(message)s',)

def n():
    logging.debug('Starting')
    logging.debug('Exiting')

def d():
    logging.debug('Starting')
    #  I expected these three following lines keep running in the background and delete any new file named 'Test'

    while True:
        if os.path.isfile('test'):
            os.remove ('test')

    time.sleep(5)
    logging.debug('Exiting')

if __name__ == '__main__':

    t = threading.Thread(name='non-daemon', target=n)
    d = threading.Thread(name='daemon', target=d)
    d.setDaemon(True)

    d.start()
    t.start()

1 Ответ

1 голос
/ 25 сентября 2019

Потоки демона уничтожаются при выходе из основного потока (см. Документы выше this ):

ForceBru:~ forcebru$ cat test.py
import threading
import time

def daemon():
    print('Daemon started')
    i = 0
    while True:
        print('Daemon running:', i)
        i += 1

d = threading.Thread(target=daemon, daemon=True)
d.start()
print('Started daemon!')
time.sleep(0.01)
print('Main thread is exiting. See if the daemon thread exits too')
ForceBru:~ forcebru$ python3 test.py
Daemon started
Daemon running: 0
Daemon running: 1
Daemon running: 2
Daemon running: 3
Started daemon!
Daemon running: 4
Daemon running: 5
Daemon running: 6
Daemon running: 7
Daemon running: 8
Daemon running: 9
Daemon running: 10
Daemon running: 11
<snip>
Daemon running: 1508
Daemon running: 1509
Daemon running: 1510
Main thread is exiting. See if the daemon thread exits too
Fatal Python error: could not acquire lock for <_io.BufferedWriter name='<stdout>'> at interpreter shutdown, possibly due to daemon threads

Thread 0x0000700008819000 (most recent call first):
  File "test.py", line 8 in daemon
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/threading.py", line 865 in run
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/threading.py", line 917 in _bootstrap_inner
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/threading.py", line 885 in _bootstrap

Current thread 0x0000000104ea95c0 (most recent call first):
Abort trap: 6
ForceBru:~ forcebru$ 

Вы не обязательно получите ошибку, но все же посмотрите начто он говорит:

Fatal Python error: could not acquire lock for <_io.BufferedWriter name='<stdout>'> at interpreter shutdown, possibly due to daemon threads

Итак, Python пытался отключиться , пока поток демона все еще работал .Итак, ваш скрипт на самом деле завершается, потому что, согласно документам:

... вся программа Python выходит , когда остаются только потоки демонов

...