簡體   English   中英

線程不會在后台運行?

[英]Thread won't run in background?

當我調用my_batch.run_jobs() ,我的線程不會在后台運行。 相反,它通過等待方法完成運行來同步運行。

對於上下文,我從.py文件中調用此方法,並且該方法在一個類中。 當我在這個文件/類之外運行相同的函數時,它在后台運行得很好。

# package_name/module_name.py


class BaseModel(Model):
    class Meta:
        database = get_db()


class Batch(BaseModel):

    def run_jobs():
        
        def sleeper():
            sleep(999)
        
        t = threading.Thread(target=sleeper)
        #t.daemon = True #tried with/ without
        t.start()

例如

my_batch = Batch()
my_batch.run_jobs()
#doesn't print until line above finishes
print("in progress")

我更新了您的代碼以進行測試。 它似乎按預期運行。

import time, threading

class BaseModel(): pass
#    class Meta:
#        database = get_db()

class Batch(BaseModel):

    def run_jobs(self):
        
        def sleeper(): # runs in background thread
            for t in range(10):
               print('<sleeper>', t)
               time.sleep(.9)
        
        t = threading.Thread(target=sleeper)
        t.start()
        
        # this runs same time as background thread (sleeper)
        for t in range(10):
           print('<rj>', t)
           time.sleep(.8)
                
mybatch = Batch()
mybatch.run_jobs()  # runs in main thread

# this loop runs after run_jobs completes
for t in range(5):
   print('<main>', t)
   time.sleep(1)

輸出

<sleeper> 0
<rj> 0
<rj> 1
<sleeper> 1
<rj> 2
<sleeper> 2
<rj> 3
<sleeper> 3
<rj> 4
<sleeper> 4
<rj> 5
<sleeper> 5
<rj> 6
<sleeper> 6
<rj> 7
<sleeper> 7
<rj> 8
<rj> 9
<sleeper> 8
<main> 0
<sleeper> 9
<main> 1
<main> 2
<main> 3
<main> 4

- - 更新 - -

這是分成模塊的相同代碼:

-- 邁克.py

import time, threading

class BaseModel(): pass
#    class Meta:
#        database = get_db()

class Batch(BaseModel):

    def run_jobs(self):
        
        def sleeper(): # runs in background thread
            for t in range(10):
               print('<sleeper>', t)
               time.sleep(.9)
        
        t = threading.Thread(target=sleeper)
        t.start()
        
        # this runs same time as background thread (sleeper)
        for t in range(10):
           print('<rj>', t)
           time.sleep(.8)

-- threadchk.py(主腳本)

import mike
import time, threading
    
mybatch = mike.Batch()
mybatch.run_jobs()  # runs in main thread

# this loop runs after method completes
for t in range(5):
   print('<main>', t)
   time.sleep(1)

輸出與上次運行相同

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM