相关疑难解决方法(0)

守护程序线程说明

在Python文档中 它说:

线程可以标记为"守护程序线程".这个标志的意义在于,当只剩下守护进程线程时,整个Python程序都会退出.初始值继承自创建线程.

有没有人更明确地解释这意味着什么或一个实际的例子显示你想要将线程设置为何处daemonic?


为我澄清一下:

因此,如果您希望它们在主线程退出后继续运行,那么您唯一不会将线程设置为守护程序的时间是?

python multithreading daemon python-multithreading

227
推荐指数
8
解决办法
12万
查看次数

Python线程守护程序属性

关于将线程设置为守护进程意味着什么,我有点困惑.文档说明了这一点:

线程可以标记为"守护程序线程".这个标志的意义在于,当只剩下守护进程线程时,整个Python程序都会退出.初始值继承自创建线程.可以通过守护程序属性设置该标志.

我不确定是什么让这与普通线程不同.这是说这个程序永远不会完成吗?

def threadfunc():
    while True:
        time.sleep(1)

threading.Thread(target=threadfunc).start()
Run Code Online (Sandbox Code Playgroud)

即使主线程完成它的执行.而

def threadfunc():
    while True:
        time.sleep(1)

th = threading.Thread(target=threadfunc)
th.daemon = True
th.start()
Run Code Online (Sandbox Code Playgroud)

马上完成?

我问,因为我有一个情况,在我的主线程中我正在调用sys.exit(),并且进程只是挂起而我的其他线程正在运行,因为我可以看到日志.这与使用线程活动调用的sys.exit()有什么关系吗?

python multithreading daemon python-multithreading

44
推荐指数
3
解决办法
6万
查看次数

Tkinter:如何使用线程来防止主事件循环"冻结"

我有一个小的GUI测试,带有"开始"按钮和进度条.期望的行为是:

  • 单击开始
  • 进度条振荡5秒
  • 进度条停止

观察到的行为是"开始"按钮冻结5秒钟,然后显示进度条(无振荡).

到目前为止,这是我的代码:

class GUI:
    def __init__(self, master):
        self.master = master
        self.test_button = Button(self.master, command=self.tb_click)
        self.test_button.configure(
            text="Start", background="Grey",
            padx=50
            )
        self.test_button.pack(side=TOP)

    def progress(self):
        self.prog_bar = ttk.Progressbar(
            self.master, orient="horizontal",
            length=200, mode="indeterminate"
            )
        self.prog_bar.pack(side=TOP)

    def tb_click(self):
        self.progress()
        self.prog_bar.start()
        # Simulate long running process
        t = threading.Thread(target=time.sleep, args=(5,))
        t.start()
        t.join()
        self.prog_bar.stop()

root = Tk()
root.title("Test Button")
main_ui = GUI(root)
root.mainloop()
Run Code Online (Sandbox Code Playgroud)

基于从布赖恩奥克利的信息在这里,我明白,我需要使用线程.我尝试创建一个线程,但我猜测,因为线程是从主线程中启动的,所以没有用.

我有想法放置在不同的类中的逻辑部分,以及从该类,类似于由A.罗达斯示例代码内实例化GUI 这里.

我的问题:

我无法弄清楚如何编码它,以便这个命令:

self.test_button = Button(self.master, command=self.tb_click)
Run Code Online (Sandbox Code Playgroud)

调用位于另一个类中的函数.这是一件坏事还是可能?我如何创建一个可以处理self.tb_click的第二类?我试着跟随A. Rodas的示例代码,它的工作非常精彩.但是我无法弄清楚如何在触发动作的Button小部件的情况下实现他的解决方案.

如果我应该在单个GUI类中处理线程,那么如何创建一个不干扰主线程的线程呢?

python multithreading tkinter event-loop progress-bar

43
推荐指数
4
解决办法
7万
查看次数

使用threading.Thread.join()

我是python中多线程的新手,并尝试使用线程模块学习多​​线程.我做了一个非常简单的多线程程序,我无法理解该threading.Thread.join方法.

这是我制作的程序的源代码

import threading

val = 0

def increment():
   global val 
   print "Inside increment"
   for x in range(100):
       val += 1
   print "val is now {} ".format(val)

thread1 = threading.Thread(target=increment, args=())
thread2 = threading.Thread(target=increment, args=())
thread1.start()
#thread1.join()
thread2.start()
#thread2.join() 
Run Code Online (Sandbox Code Playgroud)

如果我使用它会有什么不同

thread1.join()
thread2.join()
Run Code Online (Sandbox Code Playgroud)

我在上面的代码中评论了哪些?我运行了两个源代码(一个带注释,另一个没有注释),但输出相同.

python multithreading python-multithreading python-2.7

24
推荐指数
2
解决办法
4万
查看次数

如何停止守护程序线程?

我有一个简单的生产者消费者应用程

生产者是一个将东西写入队列的线程,而消费者是一个线程,它从队列中读取消息并在某些点退出.

我的制片人看起来有点像这样

def producer(queue):
    while not queue.full():
        queue.put(randint(1, 199))
Run Code Online (Sandbox Code Playgroud)

和消费者

def consumer(queue):
    for i in range(100):
        print(queue.get())
        queue.task_done()
Run Code Online (Sandbox Code Playgroud)

在我的主要部分,我调用那样的线程

p = Thread(target=producer)
c = Thread(target=consumer)

p.daemon = True
p.start()
c.start()
c.join()
Run Code Online (Sandbox Code Playgroud)

当c完成唯一剩下的非deamon线程是main时,结束这些线程的正确方法是什么?

更新

这是我的生产者正在使用的确切代码,因为消费者正在退出,问题在于生产者

def generate_random_alphanumerics(msg_queue):
    while True:
        if not msg_queue.full():
            msg_queue.put(hashlib.sha1(bytes(randint(1, 10000))).hexdigest() * 10)
        else:
            sleep(0.01)
Run Code Online (Sandbox Code Playgroud)

是线程正在睡觉的问题?

python multithreading python-multithreading python-3.x

6
推荐指数
1
解决办法
1万
查看次数

多线程websocket客户端无法正常退出

我编写了一个多线程Web套接字客户端类,以便用户的(主)线程不会阻塞run_forever()方法调用.代码似乎工作正常,除了最后,当我停止线程时,它不会干净地关闭Web套接字,我的进程不会退出.我kill -9每次都要做一个摆脱它.我尝试调用线程的join()方法来确保主线程等待子进程完成执行,但这没有帮助.

代码如下所示.你能帮助我退出/停止线程优雅吗?

import thread
import threading
import time
import websocket

class WebSocketClient(threading.Thread):

    def __init__(self, url):
        self.url = url
        threading.Thread.__init__(self)

    def run(self):

        # Running the run_forever() in a seperate thread.
        #websocket.enableTrace(True)
        self.ws = websocket.WebSocketApp(self.url,
                                         on_message = self.on_message,
                                         on_error = self.on_error,
                                         on_close = self.on_close)
        self.ws.on_open = self.on_open
        self.ws.run_forever()

    def send(self, data):

        # Wait till websocket is connected.
        while not self.ws.sock.connected:
            time.sleep(0.25)

        print 'Sending data...', data
        self.ws.send("Hello %s" % data)

    def stop(self):
        print 'Stopping the websocket...' …
Run Code Online (Sandbox Code Playgroud)

python websocket mod-pywebsocket

1
推荐指数
1
解决办法
1781
查看次数