У меня есть следующий многопоточный скрипт Python:
#!/usr/bin/python
from threading import Thread, Event
def doSum(num):
abc = 1
abc = abc + num
if __name__ == '__main__':
print "Content-Type: text/html\r\n\r\n"
p1 = Thread(target=doSum, args=(14,))
print "thread created"
p1.start()
print "thread started"
p1.join()
print "thread joining"
print "done"
Я специально создал функцию doSum, чтобы она не делала ничего полезного для этого теста. Этот скрипт отлично запускается из командной строки, но каждый раз падает на "p1.start()". Запуск strace в процессе cgi дает:
> clone(child_stack=0x7fdcad515ff0,
> flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID,
> parent_tidptr=0x7fdcad5169d0, tls=0x7fdcad516700,
> child_tidptr=0x7fdcad5169d0) = 29570 futex(0xf8c8f0,
> FUTEX_WAIT_PRIVATE, 0, NULL <unfinished ...>
> +++ killed by SIGABRT +++
Почему начало потока умирает при запуске как cgi, но не в командной строке? На веб-сервере работает suexec, поэтому процессы запускаются под одним и тем же пользователем как в случае cgi, так и в случае командной строки.
Мой провайдер работает под управлением Python 2.6.6.