请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

对于python中的线程我还是有些疑问

很认真的把这节课看了好几遍,最后自己写了一个小demo测试了一下,https://img1.sycdn.imooc.com//szimg/5b568e8b000194f508360567.jpg

跑了很多遍,得到的结果都是

https://img1.sycdn.imooc.com//szimg/5b568eae0001943204270555.jpg

,让我不禁产生了疑问,这个应该就是全局GIL起到的作用,但是和java的同步锁机制好像不太一样,这个怎么看都是执行完了一个线程中所有代码再执行另一个线程,还是说我的写法有问题- -

正在回答

插入代码

3回答

7七月 2018-07-24 12:30:37

我有点没看懂,你启用2到3个线程,别弄主线程 试试

0 回复 有任何疑惑可以回复我~
  • 提问者 a909802 #1
    我开启了两个线程,结果还是和刚刚一样的,等把线程1的循环执行完毕了才会执行线程2的循环,但是我记得同步锁的概念是防止同时操作一个元素,并不是执行完了一个线程再执行另外一个啊,这样线程不是没有意义了吗,老师我的理解可能还是不到位..
    回复 有任何疑惑可以回复我~ 2018-07-24 13:47:52
  • 7七月 回复 提问者 a909802 #2
    其实我觉得还是 代码太简单。GIL会让不同的bytes code来轮换执行,他不是代码级别的轮换,而是bytes code层面上的轮换
    回复 有任何疑惑可以回复我~ 2018-07-24 13:53:05
  • 提问者 a909802 回复 7七月 #3
    好的老师,谢谢您了
    回复 有任何疑惑可以回复我~ 2018-07-24 14:27:31
天行有常哦 2022-12-15 22:18:29
def worker1():
    t = threading.current_thread()
    time.sleep(1)
    print(t.getName(), time.time())

for i in range(10):
    print('round {}'.format(i))
    t1 = threading.Thread(target=worker1, name='t1')
    t2 = threading.Thread(target=worker1, name='t2')
    t3 = threading.Thread(target=worker1, name='t3')

    t1.start()
    t2.start()
    t3.start()

建议试试这段代码,明显能看出t1,t2,t3并不是同步执行的。

0 回复 有任何疑惑可以回复我~
慕标1049315 2020-05-12 16:01:09

原代码里肯定是先执行主线程。如果你想看到两个线程之间切换的效果,可以启动两个子线程,并且线程(函数)里加一个time.sleep().你就可以看到线程1运行到sleep的时候,程序切换到了线程2

0 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号