python多任务编程

python进程与线程

线程的注意事项

1、线程之间执行是无序的

import threading
import time

def task():
    print(threading.current_thread().name)
    time.sleep(0.5)

if __name__ == '__main__':
    # 循环创建多个线程
    for i in range(10):
        sub_thread = threading.Thread(target=task)
        sub_thread.start()

Thread-1
Thread-2
Thread-3
Thread-4
Thread-5
Thread-6
Thread-8
Thread-9
Thread-7
Thread-10

2、主线程会等待所有的子线程执行结束再结束

import threading
import time

def task():
    for i in range(10):
        print('任务中-----')
        time.sleep(0.2)

if __name__ == '__main__':
      
    sub_thread = threading.Thread(target=task)
      sub_thread.start()

    time.sleep(1)
    print('主线程')

任务中-----
任务中-----
任务中-----
任务中-----
任务中-----
主线程
任务中-----
任务中-----
任务中-----
任务中-----
任务中-----

我们可以设置子线程守护主线程,主线程退出,子线程直接销毁。
有两种方法:详情看下方代码

import threading
import time

def task():
    for i in range(10):
        print('任务中-----')
        time.sleep(0.2)

if __name__ == '__main__':
    # 方式一:daemon=True
    # sub_thread = threading.Thread(target=task, daemon=True)
    # sub_thread.start()

    # 方式二:
    sub_thread = threading.Thread(target=task)
    sub_thread.setDaemon(True)
    sub_thread.start()

    time.sleep(1)
    print('主线程')

任务中-----
任务中-----
任务中-----
任务中-----
任务中-----
主线程

3、线程之间共享全局变量

import threading
import time

g_list = []


def add_data():
    for i in range(3):
        # 将i追加到全局变量内
        g_list.append(i)
        time.sleep(0.2)

    print(g_list)


def read_data():
    print('read_data:', g_list)


if __name__ == '__main__':
    # 创建添加数据的子线程
    add_thread = threading.Thread(target=add_data)

    # 创建读取数据的子线程
    read_thread = threading.Thread(target=read_data)

    add_thread.start()

    # 让当前线程(主线程)等待添加数据的线程执行完成后代码在继续执行
    add_thread.join()
    read_thread.start()
    
	先导入线程模块,创建两个子线程

[0, 1, 2]
read_data: [0, 1, 2]

这点线程与进程不同,进程之间不共享全局变量。

4、线程之间共享全局变量数据出现错误问题。

线程在共享全局变量时,数据会出现出错的问题

import threading

# 定义一个全局变量
g_num = 0


def first_data():
    for i in range(1000000):
        # 声明全局变量
        global g_num
        g_num += 1

    print('第一个:', g_num)


def second_data():
    for i in range(1000000):
        # 声明全局变量
        global g_num
        g_num += 1

    print('第二个:', g_num)


if __name__ == '__main__':
    # 创建第一个子线程
    first_thread = threading.Thread(target=first_data)

    # 创建第二个子线程
    second_thread = threading.Thread(target=second_data)

    first_thread.start()

    # 让当前线程(主线程)等待添加数据的线程执行完成后代码在继续执行
    # first_thread.join()  # 若没有这一步数据出错 例: "第二个: 1145315; 第一个: 1204873"

    second_thread.start()

如有错误请斧正!!!
全局变量数据出错有两种解决办法。详情点击链接: https://blog.csdn.net/xbc3970/article/details/115268459

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值