PotHix

Ruby, Python e native threads

Æ!!

Pode ser que eu seja meio burro (heheh) mas eu ainda achava que o Ruby e o Python usavam Green Threads, mas depois de conversar com uma galera me disseram que eram threads nativas. Pesquisando na internet eu vi que eram mesmo, mas decidi rodar um strace para ver elas rolando e postar sobre isso.

Fiz dois scripts simples:

Python

    import threading
    import time
    for i in range(5):
        t = threading.Thread(target=time.sleep, args=(1,))
        t.start()

Ruby

    require 'thread'
    5.times do
      Thread.new {sleep 10}
    end
    sleep 1

Rodando o script python com o comando strace -f -e clone,fork python thread.py retorna pouca coisa:

    clone(Process 13920 attached
    child_stack=0x7f8570b67ff0, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7f8570b689d0, tls=0x7f8570b68700, child_tidptr=0x7f8570b689d0) = 13920
    [pid 13919] clone(Process 13921 attached
    child_stack=0x7f856bffeff0, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7f856bfff9d0, tls=0x7f856bfff700, child_tidptr=0x7f856bfff9d0) = 13921
    [pid 13919] clone(Process 13922 attached
    child_stack=0x7f856b7fdff0, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7f856b7fe9d0, tls=0x7f856b7fe700, child_tidptr=0x7f856b7fe9d0) = 13922
    [pid 13919] clone(Process 13923 attached
    child_stack=0x7f856affcff0, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7f856affd9d0, tls=0x7f856affd700, child_tidptr=0x7f856affd9d0) = 13923
    [pid 13919] clone(Process 13924 attached
    child_stack=0x7f856a7fbff0, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7f856a7fc9d0, tls=0x7f856a7fc700, child_tidptr=0x7f856a7fc9d0) = 13924
    [pid 13921] +++ exited with 0 +++
    [pid 13920] +++ exited with 0 +++
    [pid 13924] +++ exited with 0 +++
    [pid 13922] +++ exited with 0 +++
    [pid 13923] +++ exited with 0 +++
    +++ exited with 0 +++

Conseguimos ver claramente as 5 threads do SO aí em cima. :)

Já no ruby, rodando com o mesmo esquema (strace -f -e clone,fork ruby thread.rb) retorna bem mais coisas:

    clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7ff2580cc9d0) = 14588
    Process 14588 attached
    [pid 14588] clone(Process 14589 attached
    child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7ff2580cc9d0) = 14589
    [pid 14588] clone(Process 14590 attached
    child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7ff2580cc9d0) = 14590
    [pid 14589] +++ exited with 1 +++
    [pid 14590] +++ exited with 0 +++
    [pid 14588] --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=14589, si_status=1, si_utime=0, si_stime=0} ---
    [pid 14588] +++ exited with 0 +++
    --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=14588, si_status=0, si_utime=0, si_stime=0} ---
    clone(Process 14591 attached
    child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7ff2580cc9d0) = 14591
    [pid 14591] +++ exited with 0 +++
    --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=14591, si_status=0, si_utime=0, si_stime=0} ---
    clone(Process 14592 attached
    child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7ff2580cc9d0) = 14592
    [pid 14592] clone(Process 14593 attached
    child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7ff2580cc9d0) = 14593
    [pid 14593] +++ exited with 0 +++
    [pid 14592] --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=14593, si_status=0, si_utime=0, si_stime=0} ---
    [pid 14592] clone(Process 14594 attached
    child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7ff2580cc9d0) = 14594
    [pid 14594] clone(Process 14595 attached
    child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7ff2580cc9d0) = 14595
    [pid 14595] +++ exited with 1 +++
    [pid 14594] --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=14595, si_status=1, si_utime=0, si_stime=0} ---
    [pid 14594] +++ exited with 0 +++
    [pid 14592] --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=14594, si_status=0, si_utime=0, si_stime=0} ---
    [pid 14592] +++ exited with 0 +++
    --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=14592, si_status=0, si_utime=0, si_stime=0} ---
    clone(Process 14596 attached
    child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7ff2580cc9d0) = 14596
    [pid 14596] +++ exited with 0 +++
    --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=14596, si_status=0, si_utime=0, si_stime=0} ---
    clone(Process 14597 attached
    child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7fd34d4569d0) = 14597
    [pid 14597] clone(Process 14598 attached
    child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f1df327b9d0) = 14598
    [pid 14598] +++ exited with 0 +++
    [pid 14597] --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=14598, si_status=0, si_utime=0, si_stime=0} ---
    [pid 14597] clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f1df327b9d0) = 14599
    Process 14599 attached
    [pid 14599] clone(Process 14600 attached
    child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f1df327b9d0) = 14600
    [pid 14600] clone(Process 14601 attached
    child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7fb4232139d0) = 14601
    [pid 14601] clone(Process 14602 attached
    child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7fb4232139d0) = 14602
    [pid 14602] +++ exited with 0 +++
    [pid 14601] --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=14602, si_status=0, si_utime=0, si_stime=0} ---
    [pid 14601] +++ exited with 0 +++
    [pid 14600] --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=14601, si_status=0, si_utime=0, si_stime=0} ---
    [pid 14600] +++ exited with 0 +++
    [pid 14599] --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=14600, si_status=0, si_utime=0, si_stime=0} ---
    [pid 14599] +++ exited with 0 +++
    [pid 14597] --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=14599, si_status=0, si_utime=0, si_stime=0} ---
    [pid 14597] +++ exited with 0 +++
    --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=14597, si_status=0, si_utime=0, si_stime=0} ---
    clone(Process 14603 attached
    child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7fd34d4569d0) = 14603
    [pid 14603] clone(Process 14604 attached
    child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7fb42e4469d0) = 14604
    [pid 14604] +++ exited with 0 +++
    [pid 14603] --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=14604, si_status=0, si_utime=0, si_stime=0} ---
    [pid 14603] clone(Process 14605 attached
    child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7fb42e4469d0) = 14605
    [pid 14605] clone(Process 14606 attached
    child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7fb27c11e9d0) = 14606
    [pid 14606] clone(Process 14607 attached
    child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7fb27c11e9d0) = 14607
    [pid 14606] clone(Process 14608 attached
    child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7fb27c11e9d0) = 14608
    [pid 14607] +++ exited with 1 +++
    [pid 14608] +++ exited with 0 +++
    [pid 14606] --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=14607, si_status=1, si_utime=0, si_stime=0} ---
    [pid 14606] +++ exited with 0 +++
    [pid 14605] --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=14606, si_status=0, si_utime=0, si_stime=0} ---
    [pid 14605] +++ exited with 0 +++
    [pid 14603] --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=14605, si_status=0, si_utime=0, si_stime=0} ---
    [pid 14603] +++ exited with 0 +++
    --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=14603, si_status=0, si_utime=0, si_stime=0} ---
    clone(Process 14609 attached
    child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7fd34d4569d0) = 14609
    [pid 14609] clone(Process 14610 attached
    child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f2136e3e9d0) = 14610
    [pid 14610] clone(Process 14611 attached
    child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f2136e3e9d0) = 14611
    [pid 14610] clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f2136e3e9d0) = 14612
    Process 14612 attached
    [pid 14611] +++ exited with 1 +++
    [pid 14612] +++ exited with 0 +++
    [pid 14610] --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=14611, si_status=1, si_utime=0, si_stime=0} ---
    [pid 14610] +++ exited with 0 +++
    [pid 14609] --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=14610, si_status=0, si_utime=0, si_stime=0} ---
    [pid 14609] +++ exited with 0 +++
    --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=14609, si_status=0, si_utime=0, si_stime=0} ---
    clone(child_stack=0x7fa6a3eedff0, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fa6a3eee9d0, tls=0x7fa6a3eee700, child_tidptr=0x7fa6a3eee9d0) = 14613
    Process 14613 attached
    [pid 14587] clone(Process 14614 attached
    child_stack=0x7fa6a27bdff0, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fa6a27be9d0, tls=0x7fa6a27be700, child_tidptr=0x7fa6a27be9d0) = 14614
    [pid 14587] clone(Process 14615 attached
    child_stack=0x7fa6a25bbff0, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fa6a25bc9d0, tls=0x7fa6a25bc700, child_tidptr=0x7fa6a25bc9d0) = 14615
    [pid 14587] clone(Process 14616 attached
    child_stack=0x7fa6a23b9ff0, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fa6a23ba9d0, tls=0x7fa6a23ba700, child_tidptr=0x7fa6a23ba9d0) = 14616
    [pid 14587] clone(Process 14617 attached
    child_stack=0x7fa6a21b7ff0, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fa6a21b89d0, tls=0x7fa6a21b8700, child_tidptr=0x7fa6a21b89d0) = 14617
    [pid 14587] clone(Process 14618 attached
    child_stack=0x7fa6a1fb5ff0, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fa6a1fb69d0, tls=0x7fa6a1fb6700, child_tidptr=0x7fa6a1fb69d0) = 14618
    [pid 14614] +++ exited with 0 +++
    [pid 14615] +++ exited with 0 +++
    [pid 14616] +++ exited with 0 +++
    [pid 14617] +++ exited with 0 +++
    [pid 14618] +++ exited with 0 +++
    [pid 14613] +++ exited with 0 +++
    +++ exited with 0 +++
    clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7ff2580cc9d0) = 14588
    Process 14588 attached
    [pid 14588] clone(Process 14589 attached
    child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7ff2580cc9d0) = 14589
    [pid 14588] clone(Process 14590 attached
    child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7ff2580cc9d0) = 14590
    [pid 14589] +++ exited with 1 +++
    [pid 14590] +++ exited with 0 +++
    [pid 14588] --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=14589, si_status=1, si_utime=0, si_stime=0} ---
    [pid 14588] +++ exited with 0 +++
    --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=14588, si_status=0, si_utime=0, si_stime=0} ---
    clone(Process 14591 attached
    child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7ff2580cc9d0) = 14591
    [pid 14591] +++ exited with 0 +++
    --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=14591, si_status=0, si_utime=0, si_stime=0} ---
    clone(Process 14592 attached
    child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7ff2580cc9d0) = 14592
    [pid 14592] clone(Process 14593 attached
    child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7ff2580cc9d0) = 14593
    [pid 14593] +++ exited with 0 +++
    [pid 14592] --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=14593, si_status=0, si_utime=0, si_stime=0} ---
    [pid 14592] clone(Process 14594 attached
    child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7ff2580cc9d0) = 14594
    [pid 14594] clone(Process 14595 attached
    child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7ff2580cc9d0) = 14595
    [pid 14595] +++ exited with 1 +++
    [pid 14594] --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=14595, si_status=1, si_utime=0, si_stime=0} ---
    [pid 14594] +++ exited with 0 +++
    [pid 14592] --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=14594, si_status=0, si_utime=0, si_stime=0} ---
    [pid 14592] +++ exited with 0 +++
    --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=14592, si_status=0, si_utime=0, si_stime=0} ---
    clone(Process 14596 attached
    child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7ff2580cc9d0) = 14596
    [pid 14596] +++ exited with 0 +++
    --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=14596, si_status=0, si_utime=0, si_stime=0} ---
    clone(Process 14597 attached
    child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7fd34d4569d0) = 14597
    [pid 14597] clone(Process 14598 attached
    child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f1df327b9d0) = 14598
    [pid 14598] +++ exited with 0 +++
    [pid 14597] --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=14598, si_status=0, si_utime=0, si_stime=0} ---
    [pid 14597] clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f1df327b9d0) = 14599
    Process 14599 attached
    [pid 14599] clone(Process 14600 attached
    child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f1df327b9d0) = 14600
    [pid 14600] clone(Process 14601 attached
    child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7fb4232139d0) = 14601
    [pid 14601] clone(Process 14602 attached
    child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7fb4232139d0) = 14602
    [pid 14602] +++ exited with 0 +++
    [pid 14601] --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=14602, si_status=0, si_utime=0, si_stime=0} ---
    [pid 14601] +++ exited with 0 +++
    [pid 14600] --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=14601, si_status=0, si_utime=0, si_stime=0} ---
    [pid 14600] +++ exited with 0 +++
    [pid 14599] --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=14600, si_status=0, si_utime=0, si_stime=0} ---
    [pid 14599] +++ exited with 0 +++
    [pid 14597] --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=14599, si_status=0, si_utime=0, si_stime=0} ---
    [pid 14597] +++ exited with 0 +++
    --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=14597, si_status=0, si_utime=0, si_stime=0} ---
    clone(Process 14603 attached
    child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7fd34d4569d0) = 14603
    [pid 14603] clone(Process 14604 attached
    child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7fb42e4469d0) = 14604
    [pid 14604] +++ exited with 0 +++
    [pid 14603] --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=14604, si_status=0, si_utime=0, si_stime=0} ---
    [pid 14603] clone(Process 14605 attached
    child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7fb42e4469d0) = 14605
    [pid 14605] clone(Process 14606 attached
    child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7fb27c11e9d0) = 14606
    [pid 14606] clone(Process 14607 attached
    child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7fb27c11e9d0) = 14607
    [pid 14606] clone(Process 14608 attached
    child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7fb27c11e9d0) = 14608
    [pid 14607] +++ exited with 1 +++
    [pid 14608] +++ exited with 0 +++
    [pid 14606] --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=14607, si_status=1, si_utime=0, si_stime=0} ---
    [pid 14606] +++ exited with 0 +++
    [pid 14605] --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=14606, si_status=0, si_utime=0, si_stime=0} ---
    [pid 14605] +++ exited with 0 +++
    [pid 14603] --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=14605, si_status=0, si_utime=0, si_stime=0} ---
    [pid 14603] +++ exited with 0 +++
    --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=14603, si_status=0, si_utime=0, si_stime=0} ---
    clone(Process 14609 attached
    child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7fd34d4569d0) = 14609
    [pid 14609] clone(Process 14610 attached
    child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f2136e3e9d0) = 14610
    [pid 14610] clone(Process 14611 attached
    child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f2136e3e9d0) = 14611
    [pid 14610] clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f2136e3e9d0) = 14612
    Process 14612 attached
    [pid 14611] +++ exited with 1 +++
    [pid 14612] +++ exited with 0 +++
    [pid 14610] --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=14611, si_status=1, si_utime=0, si_stime=0} ---
    [pid 14610] +++ exited with 0 +++
    [pid 14609] --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=14610, si_status=0, si_utime=0, si_stime=0} ---
    [pid 14609] +++ exited with 0 +++
    --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=14609, si_status=0, si_utime=0, si_stime=0} ---
    clone(child_stack=0x7fa6a3eedff0, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fa6a3eee9d0, tls=0x7fa6a3eee700, child_tidptr=0x7fa6a3eee9d0) = 14613
    Process 14613 attached
    [pid 14587] clone(Process 14614 attached
    child_stack=0x7fa6a27bdff0, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fa6a27be9d0, tls=0x7fa6a27be700, child_tidptr=0x7fa6a27be9d0) = 14614
    [pid 14587] clone(Process 14615 attached
    child_stack=0x7fa6a25bbff0, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fa6a25bc9d0, tls=0x7fa6a25bc700, child_tidptr=0x7fa6a25bc9d0) = 14615
    [pid 14587] clone(Process 14616 attached
    child_stack=0x7fa6a23b9ff0, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fa6a23ba9d0, tls=0x7fa6a23ba700, child_tidptr=0x7fa6a23ba9d0) = 14616
    [pid 14587] clone(Process 14617 attached
    child_stack=0x7fa6a21b7ff0, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fa6a21b89d0, tls=0x7fa6a21b8700, child_tidptr=0x7fa6a21b89d0) = 14617
    [pid 14587] clone(Process 14618 attached
    child_stack=0x7fa6a1fb5ff0, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fa6a1fb69d0, tls=0x7fa6a1fb6700, child_tidptr=0x7fa6a1fb69d0) = 14618
    [pid 14614] +++ exited with 0 +++
    [pid 14615] +++ exited with 0 +++
    [pid 14616] +++ exited with 0 +++
    [pid 14617] +++ exited with 0 +++
    [pid 14618] +++ exited with 0 +++
    [pid 14613] +++ exited with 0 +++
    +++ exited with 0 +++

Alí no final dá para ver as 5 threads que eu pedi no script sendo abertas no SO. Inclusive, se analizar todo esse retorno aí dá para ver que o Ruby criou 6 threads, uma delas o ruby cria mesmo se vc fizer só um puts num script. :)

Discutir sobre linguagens com os amigos sempre é legal para pesquisar e descobrir coisas novas. :)

Há braços

Golang and 1.2 version performance improvement

Æ!!

I’ve started using Go last month and I really liked to work with the language.

The project I’m working on is dead simple and just retrieves metrics and save on a redis server (the data will be analyzed by a different project that I’m working on). So I have 15 goroutines retrieving data constantly and I’m using just two native threads.

I did some CPU profiling on the code using my current machine for Golang 1.1.2 and 1.2 and the results can be seen below.

Golang 1.1.2:

    (pprof) top10
    Total: 188701 samples
    137454  72.8%   72.8%   137454  72.8% crypto/des.permuteBlock
    44032   23.3%   96.2%   169187  89.7% crypto/des.feistel
    3750    2.0%    98.2%   184544  97.8% crypto/des.cryptBlock
    823     0.4%    98.6%   185650  98.4% crypto/cipher.(*cbcDecrypter).CryptBlocks
    290     0.2%    98.8%      290   0.2% encoding/binary.bigEndian.PutUint64
    232     0.1%    98.9%      232   0.1% encoding/binary.bigEndian.Uint64
    227     0.1%    99.0%      227   0.1% crypto/sha1.block
    215     0.1%    99.1%      267   0.1% encoding/json.state1
    207     0.1%    99.2%      430   0.2% encoding/json.checkValid
    178     0.1%    99.3%      398   0.2% encoding/json.nextValue


    # top command result
    PID USER      PR  NI  VIRT    RES      SHR S  %CPU %MEM    TIME+  COMMAND
    18115 pothix    20   0  871800  67888   3932 S 188.8  1.7  12:40.08 crebain


    # A snapshot of the processors
    %Cpu0  :100.0 us,  0.0 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
    %Cpu1  : 95.0 us,  3.0 sy,  0.0 ni,  2.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st

Golang 1.2:

    (pprof) top10
    Total: 6894 samples
    1686    24.5%   24.5%   1686    24.5%   crypto/aes.decryptBlockGo
    1299    18.8%   43.3%   3093    44.9%   crypto/cipher.(*cbcDecrypter).CryptBlocks
    471     6.8%    50.1%   1062    15.4%   encoding/json.checkValid
    420     6.1%    56.2%   541     7.8%    encoding/json.state1
    359     5.2%    61.4%   359     5.2%    crypto/sha1.block
    305     4.4%    65.9%   838     12.2%   encoding/json.nextValue
    245     3.6%    69.4%   274     4.0%    syscall.Syscall
    230     3.3%    72.7%   230     3.3%    encoding/json.stateBeginValue
    186     2.7%    75.4%   225     3.3%    encoding/json.stateEndValue
    156     2.3%    77.7%   156     2.3%    runtime.memmove


    top command result
    PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
    20534 pothix    20   0  598428  51584   3532 S  12.9  1.3   0:03.76 crebain


    %Cpu0  : 12.1 us,  5.1 sy,  5.1 ni, 72.7 id,  5.1 wa,  0.0 hi,  0.0 si,  0.0 st
    %Cpu1  : 20.0 us,  4.0 sy,  0.0 ni, 75.0 id,  1.0 wa,  0.0 hi,  0.0 si,  0.0 st

What an improvement! :)

I know that this application may not be the best example to compare Go with a different language because it depends of a third application (that is my bottleneck BTW) and Ruby perform as good as the new version but I really liked to give Go a try.

Go language has a lot of interesting ideas and it is growing fast. Looks like it is a good idea of language for some of my projects, welcome Golang!

O Guru-SP e seus 5 anos de vida

Æ!!

Há pouco tempo aconteceu o encontro numero 31 do Guru-SP, e como sempre saímos (dessa vez estavamos @vinibaggio, @agaelebe, @nuxlli e @anderson_leite) para aquele velho momento de bate papo pós evento. Durante a conversa o @nuxlli perguntou sobre como o Guru-SP começou e nesse momento eu comecei a relembrar daquela velha tarde em 2008.

Mas peraí… 2008!! O Guru-SP está próximo de fazer 5 anos de vida! :)

Em pensar que tudo começou após um post do @agaelebe na Rails-br falando sobre criar grupos locais para conversar mais sobre Ruby e fazer encontros com mais frequência, o que gerou interesse de várias pessoas de São Paulo, que decidiram levar esse “projeto” pra frente.

Logo em seguida o @mfcastellani já iniciou as primeiras discussões no grupo do Guru-SP e aproveitamos para agendar o primeiro encontro numa churrascaria qualquer no ABC que era mais próximo da casa do @mfcastellani, pois como ele nos contou depois: “Se não aparecer ninguém só comeria uma carne e voltaria para casa”. hahaha

E algumas pessoas compareceram, eramos 3 pessoas conversando sobre o que poderia ser o Guru-SP no futuro. Não conhecia o @mfcastellani nem o @agaelebe, mas ficamos boa parte da tarde conversando sobre desenvolvimento no geral e planejando o que seria legal fazer no grupo (camisetas, eventos maiores, encontros mensais, e etc).

Logo conseguimos as camisetas do Guru-SP! Depois de cotar alguns fornecedores e fazer um desenho legal para representar o grupo rachamos as despesas e mandamos fazer camisetas para quem estivesse interessado. Com a entrega das camisetas consegui conhecer muita gente que não conhecia pessoalmente.

Aproveitamos que alguns de nós estariam na Campus Party e fizemos o segundo encontro por lá! Como sempre tinha uma quantidade enorme de pessoas: Eu, o @mfcastellani e o @akitaonrails. O @shadowmaru apareceu também, mas só me encontrou para pegar a camiseta.

Nesse meio tempo já estávamos planejando aquele “encontro maior” que conversamos no primeiro encontro, e poucos meses depois saiu o Ruby + Rails no mundo real com o auxílio da Tempo Real eventos.

Apesar do quarto ter uma quantidade pequena de pessoas (apenas o @rafaelrosafu e o @agaelebe), o quinto encontro me surpreendeu bastante. Ao chegar na Voice Technology (onde o @andre_pantaliao trabalhava na época e conseguiu o espaço para o encontro) eu encontrei uma sala com mais de 20 pessoas aguardando as palestras! O encontro foi bem proveitoso e mais do que nunca percebíamos o Guru-SP crescendo.

Eu considero que depois desse encontro o Guru-SP começou a andar sozinho, conseguimos empresas parceiras para nos ajudar, o grupo cresceu bastante, sempre tinhamos boas talks nos encontros e etc.

Hoje o Guru-SP tem mais de 1100 inscritos na lista, e já tivemos encontros comuns com mais de 100 pessoas, isso sem contar os eventos que organizamos e que tiveram mais de 200 pessoas.

Temos empresas que sempre nos ajudam, seja com espaço ou coffee break. Vale agradecer a Caelum que por muito tempo nos forneceu o auditório mensalmente, e ainda hoje sempre nor provê espaço quando precisamos. Não vou tentar citar todas as empresas que ajudam porque sempre vou deixar uma de fora, mas dá para ver cada um dos patrocínios na página de encontros do Guru-SP.

Atualmente o Guru-SP não é somente focado em Ruby, mas aproveitamos muitos dos conhecimentos diversos de todos os participantes para trazer bom conteúdo em várias partes da área de desenvolvimento, o que faz com que cada vez mais tenhamos conteúdo legal e interação entre a galera.

Parabéns aos Guru-SP pelos 5 anos de vida e para todo mundo que ajudou (e/ou ainda ajuda) na organização para fazer um dos grupos de Ruby mais ativos do Brasil, e mais do que isso um lugar legal para troca de conhecimentos.

Há braços

Vendendo minhas coisas

Æ!!

Pessoal,

Esse ano aconteceram algumas coisas zuadas para mim e resolvi capitalizar o dinheiro das coisas que eu tenho e começar denovo no ano que vem.

Procurei preços justos para tudo que estou vendendo (os links das minhas pesquisas estão nas descrições dos produtos), mas caso alguém ache que alguma das coisas está com um preço não-justo e estiver interessado é só entrar em contato que negociamos.

Estou aproveitando para testar a plataforma do loja integrada, mas os pagamentos eu prefiro que sejam por depósito mesmo, e se possível marcamos a entrega pessoalmente.

Dá para acessar a loja pelo link http://loja.pothix.com (redireciona para a lojaintegrada).

Espero conseguir vender essas paradas o quanto antes. :)

Quem puder me ajudar a divulgar eu agradeço muito.

Há braços

Vendo Dragstar 2008

Æ!!

Chegou a hora de pendurar o colete por um tempo, obviamente estarei de volta num futuro não tão distante, mas pelo menos por enquanto vou ficar um tempo sem motos. Por esse motivo estou vendendo minha Dragstar 2008.

Informações sobre ela:

  • Segundo dono
  • Licenciada 2013
  • 31000 km de boas estradas!
  • Pneu dianteiro e traseiro trocados há menos de 1000km (duraram mais ou menos 29k)

Acessórios que vão com ela (além de todas as peças originais):

  • Escapamento esportivo Halley 2.5″ (não ta instalado, e tem uns ralados, mas vai junto)
  • Protetor de motor / apoio de pé
  • Raisers maiores
  • Banco bipartido do pedrinho
  • Alforge traseiro
  • Protetor de carter
  • Comando avançado
  • Plataformas dianteiras
  • Plataformas traseiras

dragstar

Quase 2k de acessórios. Se estiver interessado em comprar sem os acessórios o preço diminui também, mas entre em contato e conversamos. :)

Há Braços

Vendo intruder 125 customizada e com guidão seca suvaco

Æ!!

Depois de brincar de customização de motos por um tempo chegou a hora de vender minha intrudinha. Estou com ela desde 2008 e só me deu alegrias.

Algumas informações sobre ela:

  • Único dono
  • Toda a parafernalha que veio com ela quando eu comprei eu ainda tenho
  • IPVA pago
  • Pneu traseiro praticamente novo, não rodou nem 100km
  • Bateria nova, 1 mês de uso
  • Motor, protetor de corrente e paralamas frontal são preto fosco.

Acessórios (fora todos os itens originais que vão junto!)

  • Guidão seca de 45cm que mandei fazer especialmente para ela
  • Sissy bar
  • Retrovisor pequeno
  • Escape aberto feito especialmente para ela

Quem estiver interessado é só entrar em contato por email, ou aqui nos comentários mesmo.